X().Y(Z())和标准中的求值顺序

5
有人能引用C++标准中相应的段落吗?该段落说明以下情况下std::string构造和foo()调用的顺序是未指定的。
std::string().append(foo());

我知道有5.2.2.8,但它只涉及函数参数的问题,而不是同一序列点中多个函数调用的顺序:

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


1
5.2.2.5 "如果函数是非静态成员函数,则该函数的this参数([class.this])应初始化为调用对象的指针,转换方式如同显式类型转换一样([expr.cast])。" 看起来这似乎表明它被视为函数隐含的this参数的来源,但我不确定我的理解是否正确,因为我没有彻底阅读标准的这部分内容。 - jaggedSpire
2个回答

14

曾经广泛认为,将表达式求值的顺序保持未定义会导致更多的优化。这在10年和20年前可能是正确的,但现在似乎不再如此。有关这方面的数据已呈现给委员会,但我不知道是否已经发表。


3

5/4 [expr]:

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

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

另请参见:函数调用的顺序

“Bjarne Stroustrup在《C++程序设计语言》第3版6.2.2节中也明确表示了这一点,并给出了一些理由:

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

另请参见:C++函数参数的计算顺序


2
这里的“operator”是什么意思?operator. - FrozenHeart
(虽然operator.也被归类为函数,但是)不,不像operator+那样。抱歉没有说明清楚... - Jossie Calderon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接