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

X().Y(Z()) and the order of evaluation in standard

本文关键字:评估 顺序 标准      更新时间:2023-10-16

有人可以引用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++函数参数中的求值顺序