例如,factorial(n),如果参数是常量(表达式),则结果是确定性的,并且可以在编译时完成(通过使用模板元编程)。

是否可以只编写一个函数,这样无论何时调用它,如果参数是常量,那么结果将在编译时计算,如果它是变量,那么它将在运行时进行计算?

最佳答案

这正是 constexpr 函数存在的目的。 constexpr 函数是在 C++11 中引入的。当使用可以在编译时求值的常量表达式调用时,它们往往会在编译时求值(有时您可以强制执行此操作)。但是,一般情况下无法提供保证。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .否则,它们会在运行时进行评估(并且您可以像使用在运行时计算的常量或非常量参数的常规函数​​一样调用它们)。

除了缺乏对编译时评估的保证之外,constexpr 函数还有一些限制:它必须只包含 一个单一的返回语句 ,因此如果您正在寻找一种方法来执行任何复杂性的计算,这将获胜不符合你的需要。尽管如此, constexpr 函数可能是最接近您正在寻找的东西。

由于您提到了 factorial() 函数的示例,下面是 constexpr 函数的样子:

#include <iostream>

using namespace std;

constexpr int factorial(int n)
{
    return (n == 0) ? 1 : factorial(n - 1);
}

int foo()
{
    int result = 1;
    // do some processing...
    return result;
}

int main()
{
    int v[factorial(5)]; // Evaluated at compile-time
    cout << factorial(foo()); // Evaluated at run-time
}

关于c++ - 对于常量参数或变量参数,是否可以使函数的行为不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14552862/

10-12 07:36
查看更多