首页 > 解决方案 > 通过指针理解间接并获取地址

问题描述

在标准N1570中,Section 6.5.3.2#3指定了以下内容(emp. mine):

如果操作数是一元 * 运算符的结果,则该运算符和 & 运算符都不会被计算,结果就像两者都被省略了,除了对运算符的约束仍然适用并且结果不是左值

稍后在该部分6.5.3.2#4指定:

如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定该对象的左值

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

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

标签: cpointerslanguage-lawyerunary-operator

解决方案


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

详细说明(来自评论):

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

int a; 
&a = ...; 

不合法(显然)。但两者都不是

int a; 
&*a = ...;

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


推荐阅读