左值参考和右值参考之间的差异

daw*_*wid 4 c++ rvalue-reference c++11

我一直在研究在C++ 11中添加rvalue引用.这并不简单,但我觉得我终于开始掌握它了.然而,有一个特殊的例子我很困惑.具体来说,我没有得到这个例子中'b'的含义:

int a = 27;
int&& b = 27;
Run Code Online (Sandbox Code Playgroud)

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

我正在寻找的不是int && b = 27 什么,但直觉上是什么意思.我很困惑,因为我认为rvalues不可寻址,但在这里我们有一个rvalue的引用,这意味着我们可以解决它.那它怎么还是一个左值?

Cal*_*eth 6

int a = 27;是一个陈述,既不是左值也不是左值.它定义了名称 a,该名称可以用作类型的左值表达式int.

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


son*_*yao 5

但是在这里我们提到了rvalue,这意味着我们可以解决它.那它怎么还是一个左值?

给定int&& b = 27;,临时 int构造27,然后b绑定到临时.(并且临时的生命周期延长到了生命周期b.)之后如果你得到地址就像&b你将得到临时的地址.

BTW 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;.