当应用于函数时,我试图理解 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/