Alo*_*ave 4 c++ constexpr c++11
在以下示例中:
//Case 1
constexpr int doSomethingMore(int x)
{
return x + 1;
}
//Case 2
constexpr int doSomething(int x)
{
return ++x;
}
int main()
{}
Run Code Online (Sandbox Code Playgroud)
输出:
prog.cpp:在函数'constexpr int doSomething(int)'中:
prog.cpp:12:1:错误:表达式'++ x'不是常量表达式
为什么案例1被允许但案例2不被允许?
案例1不修改任何内容,案例2修改变量.对我来说似乎很明显!
修改变量要求它不是常量,您需要具有可变状态并且表达式++x修改该状态.由于constexpr函数可以在编译时进行评估,因此没有任何"变量"可供修改,因为没有代码正在执行,因为我们还没有运行时.
正如其他人所说,C++ 14允许constexpr函数修改它们的局部变量,允许更多有趣的东西,比如for循环.那里仍然没有真正的"变量",因此编译器需要在编译时充当简化的解释器,并允许在编译时操作有限形式的本地状态.这与更有限的C++ 11规则相比发生了重大变化.