& 返回左值或右值是啥?
Posted
技术标签:
【中文标题】& 返回左值或右值是啥?【英文标题】:What does & return a lvalue or a rvalue?& 返回左值或右值是什么? 【发布时间】:2019-10-21 03:42:36 【问题描述】:根据教科书。
地址运算符(第 2.3.2 节,第 52 页)需要一个左值操作数并返回 指向其操作数的指针作为右值。
int a = 6,c=9;
int *x = &a; //Here x is a lvalue.
x = &c;
据我所知,如果我们可以分配,它是左值。那为什么教科书上说返回右值的地址。谁能用外行语言解释一下
【问题讨论】:
它是你报价中所说的右值。您不能分配给&
的结果(例如&a = 5;
是一个错误)
它说&a
是一个右值。
@MM 是的!它应该是一个
您认为显示代码的哪一部分将某些内容分配给&a
,以支持您声称它是左值的说法?显示的代码没有将任何东西分配给&a
,而是将&a
分配给其他东西。这是一个很大的不同。
@problematicDude 在&a
中,&
是运算符,a
是操作数。由于a
是左值,因此可以使用运算符&
并返回分配给x
的右值。然后,变量x
可以被分配另一个值(如x = &c
),因为它是一个左值。
【参考方案1】:
教科书上说&a
是一个右值。 IE。值不能分配给&a
。
如果我们尝试编译下面的代码,就会出现编译错误。
int a = 6,c=9;
int *x = &a; //Here x is a lvalue.
&a = x; // Compilation error, as '&a' is an rvalue
【讨论】:
这可能有点误导;不变性不是右值的核心属性(尽管内置类型的右值确实具有某种强制不变性以帮助防止错误)【参考方案2】:据我所知,如果我们可以分配
对于类类型,这不一定是正确的。但它始终适用于您在示例中使用的指针。
那为什么教科书上说返回右值的地址
好吧,你不能分配给它:
&a = &c; // ill formed because &a is rvalue
int *x = &a; // OK. Not an assignment
x = &c; // OK because x is lvalue
【讨论】:
以上是关于& 返回左值或右值是啥?的主要内容,如果未能解决你的问题,请参考以下文章