constexpr - 为什么只是一个退货声明?

Mar*_* A. 11 c++ c++11

constexpr函数必须只包含一个return语句,并且每个参数都应该在编译时知道:

// constexpr functions use recursion rather than iteration
constexpr int factorial(int n)
{
    return n <= 1 ? 1 : (n * factorial(n-1));
}
Run Code Online (Sandbox Code Playgroud)

为什么只是退货声明?我的意思是,为什么这是错的?

// constexpr functions use recursion rather than iteration
constexpr int factorial(int n)
{
    int a = 222; //another variable
    return n <= 1 ? 1 : (n * factorial(n-1));
}
Run Code Online (Sandbox Code Playgroud)

How*_*ant 13

为什么:

因为constexpr在C++ 11中这是一个相当新颖和激进的概念,很难将主要语言标准转换为全新的东西.保守主义规则.

对于C++ 1y(目前针对C++ 14),您的示例是合法的.树干铿锵的提示已经在-std=c++1y旗帜下实现了它.


edA*_*a-y 6

正如Andy Prowl所说,它简化了实施.这可能回答"为什么",但它没有说明它是如何做到的.

只有返回值的函数,更具体地说是没有局部变量的函数,是编译器的特殊情况.此函数现在由单个表达式组成:函数的AST只需要一个根.缺少变量意味着可以在没有完整虚拟机的情况下评估此表达式来处理它,而是可以使用简单的树表达式求值程序.由于各种原因,编译器可能已经有这样的评估器,或者可以相对容易地创建一个(它变成树简化传递).

知道只constexpr在表达式中使用也提供了关键的简化.这保证了函数AST中的每个顶点都具有相同的属性,即使它是函数调用.然后整个constexpr机制是const-folding的一般形式.虽然它并不总是在编译器中的这个高级别上完成,但它确保无需大量工作即可实现(与完整的VM相比).

回到"为什么"的问题.限制主要是由供应商的资源限制驱动的.根据规定,此功能不是很大的努力,因此供应商可以在合理的时间段内实际实现它.如果没有这样的限制,特别是允许局部变量,则会大大增加所需的工作量.从用户的角度来看(我们,程序员),这些限制完全是任意的.