在标准N1570,Section 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
。