constexpr功能的规则

时间:2013-06-26 10:10:30

标签: c++ c++11 constexpr

following example

//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不被允许?

3 个答案:

答案 0 :(得分:8)

案例1不修改任何内容,案例2修改变量。对我来说似乎很明显!

修改变量要求它不是常量,需要具有可变状态,表达式++x修改该状态。由于可以在编译时评估constexpr函数,因此没有任何“变量”可供修改,因为没有代码正在执行,因为我们还没有运行时。

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

答案 1 :(得分:1)

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

作为粗略描述,它们是无副作用的表达式,可以在编译时(翻译期间)进行评估。围绕它们的规则是在考虑到这一原则的情况下创建的。

答案 2 :(得分:1)

您的论点确实有效,constexpr x+1++x的精神/技术性相同。其中x是函数的局部变量。因此,无论如何都应该没有错误

现在使用C ++ 14修复此问题。这是分叉代码和compiles fine with C++14