使用 clang 强制编译时评估 constexpr

Force compile time evaluation of constexpr with clang

要在编译时强制计算 constexpr 函数,我应该 能够将其 return 值分配给 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 中,创建一个新函数来赋值 return 值到 constexpr 变量和 return 它。

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++ return 编译器错误:

error: constexpr variable 'b' must be initialized by a constant expression

我的行为是被允许的吗?或者 clang 是限制性的?还是 gcc 过于宽容?

cpp.godbolt.org: gcc 6.1 & clang 3.8

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