当应用于函数时,我试图理解 constexpr 的含义。在下面的示例中,程序编译并运行,但我不明白如何在编译时推导出函数 sum(int n),因为 n 直到运行时才知道。我正在使用具有最新更新的 VS 2017。

无论是否包含 constexpr,程序都会编译。

#include <iostream>

constexpr int sum(int n)
{
    return (n <= 0) ? 0 : n + sum(n-1);
}

int main()
{
    int i;
    std::cin >> i;
    std::cout << sum(i) << std::endl;

    return 0;
}

我预计编译器会出错 sum(int n) 不是常量表达式。或者 constepxr 只是像“内联”这样的编译器的提示,可以随意忽略?

最佳答案


constexpr int sum(int n); 意味着可以在编译时评估该函数。不必如此。您可以在运行时调用它而不会出现任何问题,当程序员在运行时和编译时需要相同的功能时,不要强制他们复制代码是有意义的。

使用 C++20,您将能够通过使用新关键字 consteval 而不是 constexpr 限定函数来触发您期望的错误。

consteval int sum(int n)
{
    // As before...
}

int i;

// determine i at runtime...

sum(i); // Error! Not evaluated at compile time.

您可以查看 P1073 以了解此功能。该提案已被批准用于下一个标准。

关于c++ - 在这个例子中如何理解constexpr?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55470909/

10-13 09:08