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

时间:2019-04-29 08:55:59

标签: c++ clang 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的值。

为什么会这样?如何解决?

2 个答案:

答案 0 :(得分:5)

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

constexpr int init = sum(4, 5);
int a = init;

答案 1 :(得分:5)

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

如果要在编译时强制执行此类求值,则分配给它的变量也应为constexpr

aconstexpr int而不是普通的int时,就会发生这种情况。

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