constexpr函数的规则

Rules for constexpr functions

本文关键字:规则 函数 constexpr      更新时间:2023-10-16

以下示例中

//Case 1
constexpr int doSomethingMore(int x)
{
    return x + 1;
}
//Case 2
constexpr int doSomething(int x)
{
    return ++x;
}

int main()
{}

输出:

prog.cpp:在函数"constexpr int doSomething(int)"中:
prog.cpp:12:1:错误:表达式"++x"不是常量表达式

为什么情况1是允许的,而情况2是不允许的?

情况1不修改任何内容,情况2修改一个变量。对我来说似乎很明显!

修改一个变量需要它不是常量,您需要具有可变状态,并且表达式++x修改该状态。由于constexpr函数可以在编译时进行求值,因此实际上没有任何"变量"可以修改,因为没有代码在执行,因为我们还没有处于运行时。

正如其他人所说,C++14允许constexpr函数修改其局部变量,从而允许更有趣的事情,如for循环。那里仍然没有真正的"变量",因此编译器需要在编译时充当简化的解释器,并允许在编译时操作有限形式的局部状态。与更为有限的C++11规则相比,这是一个相当大的变化。

您的论点确实有效,即根据constexpr的精神/技术性,x+1++x是相同的。其中x是函数的局部变量。因此,在任何情况下都应无错误

这个问题现在用C++14解决了。这是分叉代码,它可以用C++14很好地编译。

常量表达式在第5条的最后几页中定义。

粗略地说,它们是无副作用的表达式,可以在编译时(翻译期间)进行评估。围绕它们的规则是在牢记这一原则的情况下制定的。