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


  如果操作数是一元*运算符的结果,则两者都不是
  运算符和&运算符都被求值,结果就像
  除了对操作员的约束仍然适用之外,省略了
  结果不是左值。


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


  如果操作数指向一个函数,则结果为一个函数
  代号;如果它指向一个对象,则结果是一个左值
  指定对象。


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

你能解释一下吗?这是否意味着对于对象,运算符*&不会彼此消除?

最佳答案

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

详细说明(from comment):

关键在于,一元&不会导致左值,即使在将其忽略的情况下也是如此,因为在取消引用上下文中它直接位于一元*之前。只是因为两个运算符都被忽略了,但这并不会改变结果表达式不是左值的事实。如果应用独奏&则不会如此。

int a;
&a = ...;


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

int a;
&*a = ...;


仅仅因为忽略它们并不意味着&*等于左值a

08-28 16:04