在 C++11 标准的上下文中(如你所知,它不再有序列点的概念)我想了解两个最简单的示例是如何定义的。
int i = 0;
i = i++; // #0
i = ++i; // #1
有两个关于 SO 的主题在 C++11 上下文中解释了这些示例。据说这里#0
调用了 UB 并且#1
定义明确。据说这两个例子都是未定义的。这种模棱两可让我很困惑。我已经将这篇结构良好的参考资料读了三遍,但这个话题对我来说似乎太复杂了。
.
让我们分析一下这个例子#0
:i = i++;
。
相应的报价是:
内置 postincrement 和 postdecrement 运算符的值计算在其副作用之前排序。
内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序,并在之前排序赋值表达式的值计算(即在返回对修改对象的引用之前)
如果标量对象上的副作用相对于同一标量对象上的另一个副作用未排序,则行为未定义。
据我所知,赋值运算符的副作用与它的左右参数的副作用没有顺序。因此,赋值运算符的副作用与i++
. 所以#0
调用了一个UB。
.
让我们分析一下这个例子#1
:i = ++i;
。
相应的报价是:
内置预递增和预递减运算符的副作用在其值计算之前排序(由于定义为复合赋值的隐含规则)
内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序,并在之前排序赋值表达式的值计算(即在返回对修改对象的引用之前)
如果标量对象上的副作用相对于同一标量对象上的另一个副作用未排序,则行为未定义。
我看不出,这个例子与#0
. 这对我来说似乎是一个 UB,原因与#0
. 赋值的副作用与++i
. 好像是个UB。上面喜欢的主题说它定义明确。为什么?
.
问题:如何应用引用的规则来确定示例的 UB。一个尽可能简单的解释将不胜感激。谢谢!