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