4

以下示例中:

//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?

4

3 回答 3

8

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

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

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

于 2013-06-26T10:32:51.757 回答
2

你的论点确实是有效的,因为constexpr两者的精神/x+1技术++x是相同的。wherex是函数的局部变量。因此在任何情况下都不应该有错误

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

于 2015-11-05T11:06:27.693 回答
1

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

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

于 2013-06-26T10:15:14.613 回答