constexpr-“在编译时评估值”到底是什么意思?

时间:2019-08-06 09:38:30

标签: c++

#include <array>

int value1(int param) {
    return param * 2;
}

constexpr int value2(int param) {
    return param * 2;
}

int main() {
    const int i = 10;

    std::array<int, value1(i)> starr1 = {}; // 1
    std::array<int, value2(i)> starr2 = {}; // 2

    return 0;
}

2可以,但是1会产生编译错误,因为std::array必须制作静态大小的数组。由于value2()关键字,constexpr返回编译时常量值。

那么,编译器如何推断value2(i)是编译时常量?编译时会调用函数value2()吗?

const int value1(int param) {
    return param * 2;
}

int main() {
    const int i = 10;
    std::array<int, value1(i)> starr1 = {}; // 3

    return 0;
}

>>> error: call to non-constexpr function ‘const int value1(int)’

此外,3仍然出现编译错误。即使将value1(i)关键字应用于函数constvalue1()仍不是编译时常量吗?

1 个答案:

答案 0 :(得分:7)

  

那么,编译器如何推断value2(i)是编译时常量?

这不能推断。您用constexpr注释时明确指出。但是,它可能推断出对于标记为constexpr的功能 not 。这仍然不允许您在编译时表达式中使用它们的结果,而仅用作优化策略。

  

在编译时是否调用函数value2()

从某种意义上说是的。它可能更接近直接解释它,因为我认为没有任何编译器实际上会编译该函数以在构建期间执行它。重要的是它能够在构建和运行整个程序之前确定其结果,并且可以将其结果用于例如确定生成代码时array的大小。

  

即使将value1(i)关键字应用于函数constvalue1()还是不是编译常数吗?

不是。 const仅适用于返回类型(在这种情况下,它实际上是无用的),不适用于编译时的评估可能性。