将Rvalue引用分配给Lvalue引用

7
int&& rv = 10;
int& lv = rv; //no error

这怎么可能?

这与“引用折叠规则”有关吗?

1个回答

9
 int&& rv = 10; 
 int& lv = rv; //no error

首先,一个“命名”的对象永远不是rvalue。其次,由于rv是“命名”的对象,即使它绑定到rvalue,它也不是rvalue。由于rv是lvalue,所以它可以毫无问题地绑定到lvalue。
请注意,rvalue-ness是表达式的属性,而不是变量的属性。在上面的例子中,rvalue是由10创建的,并绑定到rv,正如我所说,rv是lvalue。

1
如果 lv = 20;,会发生什么?rv 是否持有分配给未命名变量的值 10?(如果不是,我们将分配一个常量;) - ikh
1
@ikh,如果你的意思是 int & lv = rv; 然后 lv = 20。那是完全没问题的。但是,如果你的意思是 int & lv = 20; 那就是无效的。你可以把 && 看作一个魔术师,它使一个左值绑定到 右值表达式。由于你只能在变量的声明中写 &&,所以即使 x 是一个左值,你也可以写 int && x = 20;。还有另一个魔术师叫做 const,它使一个左值绑定到 rvalue,例如:int const & lv = 20;,这是有效的。 - Nawaz
这个答案是不准确的。在某些情况下,比如在return语句中的隐式移动,右值引用被认为是xvalues,而不是lvalues。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接