& 返回左值或右值是啥?

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

【讨论】:

以上是关于& 返回左值或右值是啥?的主要内容,如果未能解决你的问题,请参考以下文章

返回右值或左值

C++11 左值右值右值引用详解

c++中的左值和右值,右值引用到底是啥?关于引用这一节看得很迷糊。

函數返回值是引用类型,此函数当左值右值

C++ 函数透明地采用左值和右值参数

C语言中表达式的返回值是啥,返回到哪里?跟return有关?