首页 > 解决方案 > 在这个例子中如何理解 constexpr?

问题描述

我试图理解 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 只是像“内联”这样对编译器的提示,可以随意忽略?

标签: c++c++17

解决方案


我希望编译器会出错 sum(int n) 不是常量表达式。

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

使用 C++20,您将能够通过使用 new 关键字consteval而不是constexpr.

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

int i;

// determine i at runtime...

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

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


推荐阅读