某些代码:
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
的值。
为什么会这样?如何解决?
答案 0 :(得分:5)
如果希望在编译时预先计算一个值,然后将其绑定到允许修改的标识符,则只能通过使用constexpr
对象初始化非constexpr
对象来强制执行此操作:
constexpr int init = sum(4, 5);
int a = init;
答案 1 :(得分:5)
constexpr
说明符仅表示可以在编译时评估函数的值。这并不意味着应该在编译时对其进行评估。因此,不同的编译器/版本在此问题上具有灵活性。
如果要在编译时强制执行此类求值,则分配给它的变量也应为constexpr
。
当a
是constexpr int
而不是普通的int
时,就会发生这种情况。
要解决您的特定问题,应使用中间变量constexpr
,然后将其值分配给可以更改的变量。