Принудительная оценка времени компиляции 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
быть разрешающим?