Принудительная оценка времени компиляции constexpr с clang


Чтобы принудительно выполнить оценку функции constexpr во время компиляции, я должен быть возможность присвоить его возвращаемое значение переменной constexpr.

constexpr bool const_d_ref(const double& v) { return false; }

int main() {
  constexpr double dd = 0.0;
  constexpr bool cb = const_d_ref(dd);
}

Это, кажется, хорошо работает с g++ и clang++.

Чтобы скрыть constexpr от потребителя, я перемещаю фактическую функцию определение в namespace detail, создайте новую функцию, которая присваивает возвращает значение переменной constexpr и возвращает его.

namespace detail {
constexpr bool const_d_ref(const double& v) { return false; }
}
constexpr bool const_d_ref(const double& v) {
  constexpr bool b = detail::const_d_ref(v);
  return b;
}
int main() {
  constexpr double dd = 0.0;
  bool b = const_t_ref(dd);
  constexpr bool cb = detail::const_t_ref(dd);
}

Он работает как ожидалось с g++, но clang++ возвращает компилятор ошибка:

Ошибка: переменная constexpr 'b' должна быть инициализирована постоянным выражением

Разрешено ли то, что я делаю? Или clang быть ограничительным? Или gcc быть разрешающим?

Cpp.godbolt.org: gcc 6.1 & лязг 3.8

1 2

1 ответ:

v in constexpr bool const_d_ref(const double& v) { не является выражением времени компиляции. Поэтому detail::const_d_ref(v) также не является выражением времени компиляции.

Ваш пример будет работать, если вы измените b на const:

const bool b = detail::const_d_ref(v);

Cpp.godbolt.org