【问题标题】: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),因为它是一个左值。

标签: c++ rvalue lvalue


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2015-02-06
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多