constexpr函数的规则
Rules for constexpr functions
在以下示例中:
//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条的最后几页中定义。
粗略地说,它们是无副作用的表达式,可以在编译时(翻译期间)进行评估。围绕它们的规则是在牢记这一原则的情况下制定的。
相关文章:
- 传递通用函数,用于梯形规则的数值积分
- C++ 用于检查容器类中是否存在函数和隐式推导规则的概念
- 在 C++20 中对概念约束函数进行排序的规则是什么?
- 在类内定义的友元函数与类外定义的友元函数的查找规则之间的差异
- 提升精神 QI:在元组上自动规则演绎,在替代函数中带有序列
- c++ 17 中结构自动定义构造函数的规则是什么?
- 函数参数绑定通过参考与传递指针传递数组的规则
- C++模板函数的默认参数的 ODR 规则
- 如何严格定义函数模板显式实例化规则
- 为什么传递给函数 set::itrator 而不是 const_iterator 违反了一个定义规则?
- 函数重载中的规则
- 内联函数和一个定义规则
- 哪个查找规则阻止编译器查找函数
- 强制实施调用函数应向被调用函数返回的值添加常量的规则
- 严格别名规则是否适用于跨函数调用
- 更改了C 17中受保护构造函数的规则
- GCC不会禁用基于SFINAE规则的函数
- MISRA C++规则 14-5-1:在与类型关联的命名空间中声明的泛型函数模板的名称
- 从标准库重新定义函数是否违反了一个定义规则
- 零规则与基类析构函数