X().Y(Z()) 和标准中的评估顺序
X().Y(Z()) and the order of evaluation in standard
有人可以引用C++标准的相应段落,该段落说在以下情况下未指定std::string
构造和foo()
调用的顺序:
std::string().append(foo());
我知道有 5.2.2.8,但它声明的是函数参数,而不是相同序列点之间的几个函数调用:
函数参数的计算顺序未指定
人们普遍认为,不定义表达式求值的顺序会导致更多的优化。10年和20年前可能是这样,但现在似乎不再是这样了。这方面的数据已提交给委员会,但我不知道它是否在任何地方发布。
5/4 [EXPR]:
除非另有说明,否则未指定单个运算符的操作数和单个表达式的子表达式的计算顺序以及副作用发生的顺序
因为运算符是函数,这意味着string()
将在foo()
之前或之后构造。
另请参阅:函数调用顺序
Bjarne Stroustrup在"C++编程语言"第3版第6.2.2节中也明确指出了这一点,并有一些推理:
在没有表达式求值顺序限制的情况下,可以生成更好的代码。
另请参阅:C++函数参数中的求值顺序
相关文章:
- c++11评估顺序(未定义的行为)
- C++评估顺序优化是否意味着对不同的操作数使用不同的内核?
- 令人不安的评估顺序
- 函数参数计算顺序与 Lambda 捕获评估顺序
- std::apply是否为评估顺序提供保证
- 类型(x0 = y0,x1 = y1,x2 = x0,..)的括号和逗号表达中的评估顺序
- C++ C++17 中的序列点和对评估顺序的更改
- 关于使用共享指针的评估顺序
- C 17带有运营商超载功能的评估顺序
- 折叠表达式评估顺序
- C 评估顺序
- X().Y(Z()) 和标准中的评估顺序
- 评估顺序异常
- C++可变参数模板和评估顺序
- C++评估顺序:除法与加法
- 评估顺序 >> 和 [++]
- 函数参数评估顺序
- C++中分配语句的评估顺序
- 评估顺序和未定义的行为
- "IF"参数评估顺序?