通过指针理解间接寻址并获取地址

Understanding indirection through pointers and taking address

在标准 N1570 中,Section 6.5.3.2#3 指定了以下内容(来自我的):

If the operand is the result of a unary * operator, neither that operator nor the & operator is evaluated and the result is as if both were omitted, except that the constraints on the operators still apply and the result is not an lvalue.

稍后在 6.5.3.2#4 部分指定:

If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object.

这两个部分在我看来是矛盾的。我引用的第一个指定 result is not an lvalue,但第二个指定间接运算符的结果是左值。

你能解释一下吗?这是否意味着在对象的情况下,运算符 *& 不会相互消除?

6.5.3.2#3节讲一元&运算符,6.5.3.2#4节讲一元*运算符。他们有不同的行为。

详细说明():

关键是一元 & 不会产生左值,即使在它被认为被省略的情况下也是如此,因为它在取消引用上下文中紧接在一元 * 之前。仅仅因为两个运算符都被认为被省略并不会改变结果表达式不是左值的事实;如果应用单独的一元 & ,则情况不会相同。

int a; 
&a = ...; 

不合法(显然)。但

也不是
int a; 
&*a = ...;

仅仅因为它们被认为被省略并不意味着 &* 左值等价于 solo a