使用clang强制编译时对constexpr进行评估
Force compile time evaluation of constexpr with 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
太宽容了?
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 相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- std::condition_variable::wait()如何评估给定的谓词
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- ConstexPR :GCC比Clang更努力地评估ConstexPR
- C++:Constexpr斐波那契数列评估
- C++ constexpr语言 - 可以在编译时评估值吗?
- 表达式未评估为常数两个级别的constexpr函数(编译器错误?)
- 在评估不同参数的constexpr函数时,运行时差异
- 在模板参数中评估 constexpr 时 SFINAE 失败
- `如果constexpr(false)`始终评估为true
- C 检查是否可以评估语句ConstexPr
- visual c++ static polymorphism (CRTP) 在评估"静态 constexpr&
- 当constexpr评估负面bitshift时,不确定的行为
- 如何测试是否正确评估了 constexpr
- 为什么编译器在编译期间不评估 constexpr 函数,当每个信息都给出时?
- 使用clang强制编译时对constexpr进行评估
- 评估 cout 是否具有 constexpr 值