将右值引用绑定到右值引用?

Toc*_*cio 2 c++ reference forward rvalue lvalue

我试图编译:

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

它的工作原理.我知道"a"是一个左值,但为什么我可以将"rvalue to int"绑定到"对int的lvalue引用(而不是对int的rvalue引用)"?这样,我可以改变临时值,3:

b=5 //changing the value of the temporary bound to the rvalue reference
Run Code Online (Sandbox Code Playgroud)

这个tecnique用于std :: forward,所以我认为这是一个标准的行为.对int的rvalue引用是否被视为存储临时的简单int左值?如果没有,你如何解释绑定?

Lig*_*ica 6

引用不绑定到其他引用; 它们绑定到对象.

初始化a3,您将创建一个生命周期延长的新临时int对象.只是对该对象的另一个引用.b

请注意,a 一个左值,因为它是一个表达式命名的对象,即使它有键入 "右值引用来int"!注意不要将类型值类别混淆,这里:类型与对象相关,但值类别与表达式相关(即使这些表达式命名或以其他方式计算到某个对象).

当你想到它们时,这些令人困惑的规则都非常巧妙地融合在一起:因为原始引用已经有效,所以对象的生命周期必须延长,所以b初始化是安全的.