11

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

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

为什么只有 return 声明?我的意思是,为什么这是错误的?

// 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));
}
4

2 回答 2

13

为什么:

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

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

于 2013-06-09T02:41:40.480 回答
7

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

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

知道 onlyconstexpr在表达式中使用也提供了关键的简化。这保证了函数 AST 中的每个顶点都具有相同的属性,即使是函数调用。整个constexpr机制就是 const-folding 的一种广义形式。尽管它并不总是在编译器的这个高级别上完成,但它确保它可以在不费力气的情况下实现(与完整的 VM 相比)。

回到“为什么”的问题。这种限制主要是由供应商的资源限制驱动的。正如指定的那样,此功能并不是一项巨大的工作,因此供应商实际上可以在合理的时间内实现它。如果没有这样的限制,特别是允许局部变量,它会大大增加所需的工作量。然而,从用户(我们,程序员)的角度来看,这些限制是完全任意的。

于 2013-06-09T03:57:46.230 回答