Clang 在编译时不会计算非 constexpr 变量的 constexpr 函数的值
Clang doesn't evaluate the value of the constexpr function for the non-constexpr variable at compile time
一些代码:
constexpr int sum(int a, int b) {
return a + b;
}
int main() {
int a = sum(4, 5);
return 0;
}
我用clang-9
编译了这段代码,但它在编译时没有计算 main 函数中 int a
的值。如果我使用 constexpr int a
clang 在编译时计算它,但我无法在运行时更改此变量。
但gcc-7.1
编译时评估int a
的值。
为什么会这样?如何解决?
当您希望在编译时预先计算一个值,然后绑定到允许修改的标识符时,您只能通过使用constexpr
对象初始化非constexpr
对象来强制执行此操作:
constexpr int init = sum(4, 5);
int a = init;
constexpr
说明符仅表示可以在编译时计算函数的值。这并不意味着应该在编译时对其进行计算。因此,不同的编译器/版本在这件事上具有灵活性。
如果要在编译时强制执行此类计算,则分配给它的变量也应constexpr
。
当a
constexpr int
而不仅仅是普通int
时,就会发生这种情况。
要解决您的特定问题,您应该使用constexpr
的中间变量,然后将其值分配给可以更改的变量。
相关文章:
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- constexpr函数中的静态constexpr变量
- 有时可以在 constexpr 上下文中使用非 constexpr 变量?
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 是否使用静态 constexpr 变量 odr?
- 是否可以将变体的索引作为 constexpr 变量获取?
- 非 constexpr 变量模板的开销是否为零?
- Constexpr变量不是编译时值
- 为什么非成员静态 constexpr 变量不是隐式内联的?
- 使用 constinit 变量初始化 constexpr 变量
- 这是通过初始化 constexpr 变量来标记编译错误的合理跳转
- "static initialization order fiasco"是 constexpr 变量的问题吗?
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- is_constant_evaluated() 应该产生 constexpr 变量吗?
- 是否都是隐式内联的 constexpr 变量
- 为全局constexpr变量生成唯一值
- 错误!Constexpr变量必须通过常数表达式constexpr初始化
- 为什么我不能使用 msvc 在模板类中声明静态 constexpr 变量?
- 如果Constexpr - clang vs.GCC,则非constexpr变量
- Clang 在编译时不会计算非 constexpr 变量的 constexpr 函数的值