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

Fro*_*art 4 c++ operator-precedence language-lawyer

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

std::string().append(foo());
Run Code Online (Sandbox Code Playgroud)

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

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

小智 11

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


Jos*_*ron 3

5/4 [表达式]:

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

因为运算符是函数,所以这意味着string()将在 before 或 after 构造foo()

另请参阅:函数调用顺序

“Bjarne Stroustrup 在《C++ 编程语言》第 3 版第 6.2.2 节中也明确指出了这一点,并给出了一些推理:

在不限制表达式求值顺序的情况下可以生成更好的代码。

另请参阅:C++ 函数参数中的求值顺序

  • 这里的“操作员”是什么意思?`操作员。`? (2认同)