Clang 在编译时不会计算非 constexpr 变量的 constexpr 函数的值

Clang doesn't evaluate the value of the constexpr function for the non-constexpr variable at compile time

本文关键字:constexpr 变量 函数 计算 编译 Clang      更新时间:2023-10-16

一些代码:

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的中间变量,然后将其值分配给可以更改的变量。