i + = ++我在C++ 0x中的未定义行为吗?

Sau*_*nda 14 c++ undefined-behavior compound-assignment c++11

我非常确信我已经发现,就C++ 0x而言,这i = ++i 并不是未定义的,但我无法判断是否有i += ++i明确定义的行为 .任何接受者?

Bar*_*nau 9

i = ++i明确定义的推理同样可以用来证明i += ++i必须明确定义.

i += ++i相当于i += (i += 1)和新的排序规则要求赋值发生在i += 1子表达式的值计算之前.
这意味着表达式的结果i += ++i必须与for 的结果相同i = 2 * i + 1.

编辑:我必须修改我的答案,因为行为毕竟是未定义的.
行为i += ++i是未定义的,因为子表达式i(左侧参数)的值计算++i相互之间没有相互排序,其中一个包含对象的更新i.

这对于表达式来说不是问题i = ++i,因为i左侧没有进行左值到右值的转换,这种情况确实发生了i += ++i.


旁注:不要在任何严肃的项目中编写此类代码.它过分依赖于完全了解排序规则,并且会有许多人不能正确理解排序规则,不知道DR 637导致的规则变化或因缺少一些重要而被绊倒有问题的表达方面(在撰写本答案的第一个修订版时发生在我身上).