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
说明符仅表示可以在编译时评估函数的值。这并不意味着应该在编译时对其进行评估。所以不同compilers/versions在这件事上有灵活性。
如果你想在编译时强制执行这样的计算,那么它赋值的变量也应该是constexpr
。
当 a
是 constexpr int
而不仅仅是普通的 int
时会发生这种情况。
要解决您的特定问题,您应该使用中间变量 constexpr
,然后将其值分配给可以更改的变量。
一些代码:
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
说明符仅表示可以在编译时评估函数的值。这并不意味着应该在编译时对其进行评估。所以不同compilers/versions在这件事上有灵活性。
如果你想在编译时强制执行这样的计算,那么它赋值的变量也应该是constexpr
。
当 a
是 constexpr int
而不仅仅是普通的 int
时会发生这种情况。
要解决您的特定问题,您应该使用中间变量 constexpr
,然后将其值分配给可以更改的变量。