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



要在编译时强制执行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太宽容了?

cp.godbolt.org: GCC 6.1 &铿锵声3.8

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

如果将b更改为const:

,您的示例将正常工作
const bool b = detail::const_d_ref(v);
cpp.godbolt.org

最新更新