int&& rv = 10; int& lv = rv; //no error 首先,一个“命名”的对象永远不是rvalue。其次,由于rv是“命名”的对象,即使它绑定到rvalue,它也不是rvalue。由于rv是lvalue,所以它可以毫无问题地绑定到lvalue。请注意,rvalue-ness是表达式的属性,而不是变量的属性。在上面的例子中,rvalue是由10创建的,并绑定到rv,正如我所说,rv是lvalue。
lv = 20;
,会发生什么?rv
是否持有分配给未命名变量的值10
?(如果不是,我们将分配一个常量;) - ikhint & lv = rv;
然后lv = 20
。那是完全没问题的。但是,如果你的意思是int & lv = 20;
那就是无效的。你可以把&&
看作一个魔术师,它使一个左值绑定到 右值表达式。由于你只能在变量的声明中写&&
,所以即使x
是一个左值,你也可以写int && x = 20;
。还有另一个魔术师叫做const
,它使一个左值绑定到rvalue
,例如:int const & lv = 20;
,这是有效的。 - Nawazreturn
语句中的隐式移动,右值引用被认为是xvalues,而不是lvalues。 - undefined