#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() 是否也不是编译时常量?

最佳答案



它没有推断出这一点。当您使用 constexpr 对其进行注释时,您会明确说明这一点。不过,它可能会推断出未标记为 constexpr 的函数。这仍然不允许您在编译时表达式中使用它们的结果,并且仅用作优化策略。



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



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

关于c++ - constexpr - "Evaluate value at compile time"究竟是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57373128/

10-11 22:49
查看更多