14

我对我发现的解释深信不疑,就 C++0x 而言,这i = ++i 并不是未定义的,但我无法判断 的行为是否 i += ++i定义明确。有接盘侠吗?

4

1 回答 1

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 导致的规则变化,要么因为错过了一些重要的事情而被绊倒有问题的表达式的各个方面(就像我在撰写此答案的第一个修订版时发生的那样)。

于 2010-10-14T13:54:26.203 回答