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

问题描述 投票:5回答:2

一些代码:

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的价值。

为什么会这样?怎么解决?

c++ clang constexpr
2个回答
5
投票

constexpr说明符仅表示可以在编译时评估函数的值。这并不意味着它应该在编译时进行评估。因此,不同的编译器/版本在这个问题上具有灵活性。

如果要在编译时强制执行此类评估,则分配给它的变量也应该是constexpr

这发生在aconstexpr int而不仅仅是一个普通的int

要解决您的特定问题,您应该使用constexpr的中间变量,然后将其值分配给可以更改的变量。


5
投票

如果希望在编译时预先计算值,但随后绑定到允许修改的标识符,则只能通过使用constexpr对象初始化非constexpr对象来强制执行此操作:

constexpr int init = sum(4, 5);
int a = init;
© www.soinside.com 2019 - 2024. All rights reserved.