我试图编译:
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左值? 如果没有,你如何解释绑定?
答案 0 :(得分:6)
引用不会绑定到其他引用;它们绑定到对象。
当您从a
初始化3
时,您会创建一个新的临时int
对象whose lifetime is extended。 b
只是对该对象的另一个引用。
请注意a
是左值,因为它是一个命名对象的表达式,即使它有 type " rvalue-reference to int
&#34 ;!注意不要将类型与值类别混淆,这里:类型与对象相关,但值类别与表达式相关(即使这些表达式名称相关)或以其他方式评估某些对象)。
当你想到它时,这些令人困惑的规则都非常巧妙地融合在一起:因为原始参考已经有效,所以对象的生命周期必须延长,所以b
' s初始化是安全的。