根据广义常量表达式——修订版 5,以下内容是非法的。
constexpr int g(int n) // error: body not just ‘‘return expr’’
{
int r = n;
while (--n > 1) r *= n;
return r;
}
这是因为所有 'constexpr' 函数都必须采用{ return expression; }
. 我看不出有任何理由需要这样做。
在我看来,唯一真正需要的是不读取/写入外部状态信息,并且传入的参数也是“constexpr”语句。这意味着对具有相同参数的函数的任何调用都将返回相同的结果,因此可以在编译时“知道”。
我的主要问题是它似乎只是迫使你做真正迂回的循环形式,并希望编译器对其进行优化,以便它对于非 constexpr 调用同样快。
constexpr
要为上面的例子写一个有效的,你可以这样做:
constexpr int g(int n) // error: body not just ‘‘return expr’’
{
return (n <= 1) ? n : (n * g(n-1));
}
但这更难理解,当您使用违反const-expr
.