X()。Y(Z())和标准中的评价顺序

时间:2016-06-07 21:12:50

标签: c++ language-lawyer operator-precedence

有人可以引用C ++标准的相应段落,该段落表示std::string构造和foo()调用的顺序在以下情况中未指定:

std::string().append(foo());

我知道有5.2.2.8,但它说明了函数参数,而不是相同序列点之间的几个函数调用:

  

函数参数的评估顺序未指定

2 个答案:

答案 0 :(得分:9)

人们普遍认为,保留表达评估顺序不确定会导致更多优化。 10年和20年前可能是真的,但它似乎不再如此。这方面的数据已提交给委员会,但我不知道它是否在任何地方发布。

答案 1 :(得分:3)

  

5/4 [expr]:

除非另有说明,否则单个运算符的操作数和各个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的

因为运算符是函数,这意味着string()将在foo()之前或之后构建。

另见:Order of function call

“Bjarne Stroustrup在”C ++编程语言“第3版第6.2.2节中明确说明了这一点,但有一些推理:

  

在没有对表达式评估顺序的限制的情况下,可以生成更好的代码。

另见:Order of evaluation in C++ function parameters