左值引用和右值引用之间的区别

Difference between lvalue reference and rvalue reference

本文关键字:引用 区别 之间      更新时间:2023-10-16

我一直在研究 C++11 中右值引用的添加。这并不简单,但我觉得我终于开始掌握它了。然而,有一个特殊的例子让我感到困惑。具体来说,我不明白这个例子中"b"的含义是什么:

int a = 27;
int&& b = 27;

编辑:我知道int a = 27是一个左值而不是左值引用。

此外,我寻找的不是int&&b = 27是什么,而是直觉上的含义。我很困惑,因为我认为右值是不可寻址的,但在这里我们有一个对右值的引用,这意味着我们可以解决它。那么为什么它仍然是一个右值呢?

int a = 27;

是一个语句,既不是左值也不是右值。它定义了名称a,可用作int类型的左值表达式

int&& b = 27;也是一个语句,名称b用作类型为int&&的左值表达式,并允许转换为类型为int的xvalue表达式

但在这里我们引用了右值,这意味着我们可以解决它。那么为什么它仍然是一个右值呢?

给定int&& b = 27;,一个临时int27构造而成,然后b绑定到临时。(并且临时的生存期延长至b的生存期。之后,如果您获得像&b这样的地址,您将获得临时地址。

顺便说一句,b本身就是一个左值。

在以下情况下when a prvalue is materialized so that it can be used as a glvalue, which occurs (since C++17)创建临时对象:

  • 将引用绑定到 prvalue

顺便说一句:对于右值引用来说,这不是特别的;同样的事情发生在const int& b = 27;身上。

B 是右值引用,您只能为其分配右值。