C++11中赋值运算符副作用的评估顺序



如果有人能澄清C++11中赋值语句的副作用顺序,我将不胜感激。例如,给我指一下与之相关的标准文本。

cppresence.com上关于评估订单的页面说明了以下关于分配的内容:

8(内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改(在左参数和右参数的值计算(但不是副作用(之后排序,并且在赋值表达式的值计算之前(即在返回对修改对象的引用之前(进行排序

"(但不是副作用(是什么意思?副作用是不是在修改左自变量之后(甚至可能是在返回引用之后(按顺序排列的?

例如,增量后操作发生在:而(*tgt++=*src++(;

从评估顺序可以清楚地看出,首先执行值计算,因此首先计算*tgt*src。但知道什么时候会出现增量后的副作用吗?

编辑#1:

据我所知,未定义的行为和顺序点并没有回答我的问题。事实上,这是我进入"兔子洞"的开始,最终导致我进入cppreference.com。我特别想知道的是C++11中赋值运算符的副作用排序的定义。在未定义的行为和序列点中回答的问题是序列undefinedunspecied behaviourimpementation specific behaviour的概念之间的关系。顺便说一句,答案很好。

编辑#1结束

向致以最良好的问候

什么是"(但不是副作用(?

这句话强调了一个事实,即该句没有声称副作用的顺序。

副作用是否未测序、未最终测序或在修改左侧自变量后测序(甚至可能在返回参考后测序?

这是在讨论每种特定副作用的段落中确定的。例如,后缀增量运算符的副作用在其值计算之后被排序,并且声明不确定排序的函数调用不能干预。我找不到关于这个算子的测序的其他说法。如果确实没有,就必须得出结论,它与任务无关。

首先,请注意C++17对表达式求值顺序进行了一些更改。

让我们先来看看目前的标准草案有什么要说的。我想相关的应该是[介绍.执行]/7

[…]表达式(或子表达式(的评估通常包括值计算(包括确定用于glvalue评估的对象的身份和获取先前分配给用于prvalue评估的目标的值(和副作用的启动。[…]

和[interro.execution]/10

除非另有说明,否则单独运算符的操作数和单独表达式的子表达式的求值都是无序列的。[…]运算符的操作数的值计算在运算符结果的值计算之前排序。[…]

最后是[expr.ass]/1

[…]在所有情况下,赋值都是在右操作数和左操作数的值计算之后,赋值表达式的值计算之前进行的。右操作数在左操作数之前排序。[…]

基于此,我得出结论,在中

while (*tgt++ = *src++);

在CCD_ 8的评估之前对CCD_。由于while循环中的条件是一个完整表达式,因此在循环的一次迭代中发生的所有评估和副作用都将在下一次迭代的评估和副效果之前排序。

据我所见,在C++11中,*src*tgt的评估彼此之间没有排序,但在分配的副作用之前排序。增量和分配的副作用也没有按顺序排列。

最新更新