*&++我在C++ 03中导致未定义的行为吗?

M.M*_*M.M 21 c++ undefined-behavior sequence-points language-lawyer c++03

另一个答案有人指出,之前C++ 11,其中i是一个int,则使用表达式:

*&++i
Run Code Online (Sandbox Code Playgroud)

导致未定义的行为.这是真的?

另一个答案是在评论中进行了一些讨论,但似乎并不令人信服.

Che*_*Alf 7

询问*&++iUB本身是否具有UB 是没有意义的.i通过将其用作引用的初始化表达式,您可以看到引用不一定访问存储的值(先前或新的).只有涉及右值转换(在这种情况下使用)才有任何问题需要讨论.然后,由于我们可以使用值++i,我们可以使用*&++i与完全相同的警告值++i.

最初的问题基本上i = ++i与...有关i = *&++i.这是C++ 03中未定义的行为,由于i在序列点之间被修改了两次,并且在C++ 11中定义良好,因为赋值运算符的左侧和左值计算后的顺序效应是有序的.右手边.

或许有必要指出,C++ 98和C++ 03标准中的非规范性示例是不正确的,将正式未定义行为的某些情况描述为仅仅未指定的行为.因此,意图一直没有完全清楚.一个好的经验法则是不要依赖语言的这些模糊的角落案例,以避免它们:为了理解代码,不应该成为一名语言律师......


Bar*_*rry 0

我认为只有当我们处理以下表达式时,这个问题才有意义:

i = *&++i;
Run Code Online (Sandbox Code Playgroud)

C++03 标准中的相关引用为 [expr]/4:

除非另有说明,否则未指定各个运算符的操作数和各个表达式的子表达式的求值顺序以及副作用发生的顺序。在上一个和下一个序列点之间,标量对象的存储值最多应通过表达式的求值修改一次。此外,应仅访问先前值以确定要存储的值。对于完整表达式的子表达式的每个允许的排序,应满足本段的要求;否则行为是未定义的。

i = ++i + 1; // the behavior is unspecified
Run Code Online (Sandbox Code Playgroud)

i = *&++i我们可以通过比较vs的顺序i = ++i + 1来确定相同的规则导致两者都未指定。它们都是以下形式的语句:

i = f(++i);
Run Code Online (Sandbox Code Playgroud)

对于任何函数,左侧f的读取和右侧 的副作用彼此之间没有顺序关系。因此,存在未定义的行为。i++i