一些代码:
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
。
这发生在a
是constexpr int
而不仅仅是一个普通的int
。
要解决您的特定问题,您应该使用constexpr
的中间变量,然后将其值分配给可以更改的变量。
如果希望在编译时预先计算值,但随后绑定到允许修改的标识符,则只能通过使用constexpr
对象初始化非constexpr
对象来强制执行此操作:
constexpr int init = sum(4, 5);
int a = init;