要在编译时强制执行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