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

时间:2014-09-06 23:45:51

标签: c++ reference forward lvalue rvalue

我试图编译:

int &&a=3;
int &b=a;

它有效。 我知道" a"是一个左值,但为什么我可以将一个"右值引用绑定到int"到"左值对int的引用(不是对int的rvalue引用)"? 这样,我可以更改临时值3:

b=5 //changing the value of the temporary bound to the rvalue reference

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

1 个答案:

答案 0 :(得分:6)

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

当您从a初始化3时,您会创建一个新的临时int对象whose lifetime is extendedb只是对该对象的另一个引用。

请注意a 左值,因为它是一个命名对象的表达式,即使它有 type " rvalue-reference to int&#34 ;!注意不要将类型值类别混淆,这里:类型与对象相关,但值类别与表达式相关(即使这些表达式名称相关)或以其他方式评估某些对象)。

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