如果有人能澄清C++11中赋值语句的副作用排序问题,我将非常感激。例如,请告诉我处理它的相关标准文本。
评价顺序 on cpprefence.com上的页面说明了有关作业的如下内容:
8)内建赋值操作符和所有内置复合赋值运算符的副作用(左参数的修改)和所有内置复合赋值运算符的副作用是在左、右参数的值计算(但不是副作用)之后排序的,并在赋值表达式的值计算之前(即,在返回对修改对象的引用之前)进行排序。
什么是“(但不是副作用)?副作用是未排序的,无顺序的,还是在后顺序修改了左参数(或者甚至是在之后对引用进行了排序?”
例如,何时在: while (*tgt++= *src++)中执行增量后操作;
从评价顺序中可以清楚地看出,值计算是首先执行的,因此首先计算*tgt和*src。但是,是否知道增量后的副作用何时发生?
编辑#1:
据我所知,未定义的行为和序列点没有回答我的问题。事实上,这是我跌入“兔子洞”的开始,最终我来到了cppreference.com。我特别想知道的是测序对C++11中赋值算子的副作用的定义,未定义的行为和序列点回答的问题是测序与undefined、unspecied behaviour和impementation specific behaviour概念之间的关系。顺便说一句,答案很好。
编辑#1的端
诚挚的问候
发布于 2018-11-28 11:31:25
首先,请注意C++17引入了相当多的对表达式计算顺序的更改。
让我们先看看目前的标准草案有什么要说的。我想这里应该是[intro.execution]/7
…表达式(或子表达式)的评估一般包括值计算(包括确定用于极值评估的对象的标识,以及获取先前分配给对象用于prvalue评估的值)和副作用的启动。…
和[intro.execution]/10
除注意到的情况外,对单个运算符的操作数和单个表达式的子表达式的评估是不按顺序进行的。…在运算符的结果计算值之前,对操作符的操作数的值计算进行排序。…
最后是[expr.ass]/1
…在所有情况下,分配都是在计算右和左操作数的值之后,以及在分配表达式的值计算之前进行的。右操作数在左操作数之前进行排序。…
基于此,我的结论是
while (*tgt++ = *src++);*src的评估是在*tgt评估之前进行的,而每个增量的副作用以及分配都是不顺序的。由于while循环中的条件是全表达,所以在下一次迭代的评估和副作用之前,会对循环的一个迭代中发生的所有评估和副作用进行排序。
据我所见,在C++ 11中,*src和*tgt的评价是相对的,但在赋值的副作用之前是按顺序排列的。增量和分配的副作用也不按顺序排列。
发布于 2018-11-28 11:57:06
什么是“(但不是副作用)?
这句话强调了这样一个事实,即句子中没有关于副作用排序的说法。
副作用是在左参数修改后没有排序、无顺序排序还是排序(或者甚至在返回引用后进行排序?)
这是在讨论每个特定副作用的段落中确定的。例如,后缀增量操作符的副作用是在其值计算后进行排序,并且指出不确定顺序的函数调用不能干预。关于这个操作符的排序,我找不到其他的说法了。如果确实没有,就必须得出结论,它是未排序的w.r.t。任务。
https://stackoverflow.com/questions/53517119
复制相似问题