使用 clang 强制对 constexpr 进行编译时评估

Ram*_*m-Z 2 c++ g++ constexpr clang++ c++14

为了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);
}
Run Code Online (Sandbox Code Playgroud)

这似乎适用于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);
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作g++,但clang++返回编译器错误:

错误:constexpr 变量“b”必须由常量表达式初始化

我的所作所为是允许的吗?还是clang被限制了?或者是gcc被宽容?

cpp.godbolt.org: gcc 6.1 & clang 3.8

How*_*ant 5

vinconstexpr bool const_d_ref(const double& v) {不是编译时表达式。因此detail::const_d_ref(v)也不是编译时表达式。

如果您更改bconst

const bool b = detail::const_d_ref(v);
Run Code Online (Sandbox Code Playgroud)

cpp.godbolt.org