在标准N1570中,Section 6.5.3.2#3
规定了以下内容(emp.min(:
如果操作数是一元*运算符的结果,则运算符或&对运算符进行求值,结果就好像两者省略了,只是对运算符的约束仍然适用并且结果不是左值。
稍后6.5.3.2#4
部分指定:
如果操作数指向函数,则结果为函数指示符;如果它指向一个对象,结果是一个左值,指定对象。
我觉得这两部分很矛盾。我引用的第一部分指定result is not an lvalue
,但第二部分指定间接运算符的结果是左值。
你能解释一下吗?这是否意味着在对象的情况下,运算符*
和&
不相互消除?
第6.5.3.2#3节讨论一元&
运算符,第6.5.3.2#4节讨论一元*
运算符。他们有不同的行为。
精化(来自评论(:
关键是一元&
不会产生左值,即使在它被认为是省略的情况下也是如此,因为它在解引用上下文中直接位于一元*
之前。仅仅因为这两个运算符都被认为是省略的,并不能改变结果表达式不是左值的事实;与应用单独的一元CCD_ 10的情况相同。
int a;
&a = ...;
(显然(不合法。但也不是
int a;
&*a = ...;
仅仅因为它们被认为是省略的并不意味着&*
的左值等价于单独的a
。