Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 左值引用和右值引用之间的差异_C++_C++11_Rvalue Reference - Fatal编程技术网

C++ 左值引用和右值引用之间的差异

C++ 左值引用和右值引用之间的差异,c++,c++11,rvalue-reference,C++,C++11,Rvalue Reference,我一直在研究C++11中右值引用的加法。这并不简单,但我觉得我终于开始掌握它了。然而,有一个特别的例子让我感到困惑。具体来说,我不明白本例中“b”的含义: int a = 27; int&& b = 27; 编辑:我知道int a=27是一个左值而不是左值引用 另外,我要寻找的不是int&&b=27是什么,而是直觉上它是什么意思。我很困惑,因为我认为右值在不可寻址的地方,但这里我们有一个对右值的引用,这意味着我们可以寻址它。那么为什么它仍然是右值呢 B是右值引用,您只能为其分配

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

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


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

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

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

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

但是这里我们有一个对右值的引用,这意味着我们可以处理它。那么为什么它仍然是右值呢

给定
int&&b=27
,一个
int
27
构造,然后
b
绑定到临时文件。(临时文件的生存期延长到
b
的生存期)之后,如果您像
&b
那样获得地址,您将获得临时文件的地址

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

当prvalue被物化时,会创建临时对象
,以便将其用作glvalue,这在以下情况下发生(自C++17起)

  • 将引用绑定到prvalue

顺便说一句:这不是特别为右值参考;同样的事情发生在
const int&b=27

可能的重复@elvis.dukaj这不是正确的重复项我知道int a=27不是左值引用。这是左值。我只是在展示它们,因为它们在这里的意思似乎是一样的(尽管我知道它们不是)。另外,我确信关于左值和右值的问题有数百万个,但我特别想知道“int&&=27”是什么意思。可能重复的可能重复的可能重复的我知道它是右值引用。你需要在你的提问中更具体一些,这正是我想要知道的。所以它是一个左值,这意味着a和b在类型上是相等的?我明白了。所以int&&可以显式转换为int?@dawid您可以从
int&&
初始化
int&
,就像从
int
int&
初始化一样,是的。在
int
的特定情况下没有区别,但是从
std::vector&&
初始化
std::vector
将执行与
std::vector&
不同的操作