假设代码编译,之间有什么区别:
A && a = .....
和
A & a = .....
? a
是函数或方法中的局部变量,而不是参数。
通过给rvalue-reference一个名称(a
),它实际上是范围其余部分的左值?即使使用前一种形式,在将move(a)
传递给另一个函数时,您必须使用a
来启用盗窃?
我很欣赏第二种形式可能存在其他问题,这会阻止编译,例如,您不能对临时文件进行(非常量)引用。所以,是的,我很想知道所有的差异,但首先我要确认我的预感,它们完全等同于范围的其余部分。
更新:作为@KerrekSB重申的“临时”问题的一个示例,有时您必须使用简单引用const
。在这种情况下,我的问题是:
const A && a = .....
和
const A & a = .....
答案 0 :(得分:1)
这有效:
int foo();
int && a = foo();
这不是:
int & b = foo(); // error, cannot bind rvalue to non-const ref
答案 1 :(得分:1)
A && a= ...
和A & a= ...
之间的区别在于前者可以绑定到临时值,而后者则不能。 C ++标准现在指定引用必须是非易失性const或绑定到临时的rvalue引用(参见8.5.3引用[dcl.init.ref]),然后可以延长临时的生命周期(参见12.2 [class.temporary])。
编辑:如果你考虑rvalue引用允许你做什么,他们必须能够绑定到temporaries,否则,你将无法用C ++表达移动语义。
答案 2 :(得分:1)
分别在一个案例和另一个案例中调用operator A&
和operator A&&
可能会有所不同(您需要检查修改/修复该部分的规范和the DRs规格)。
对于这两种情况,明确不同的是decltype(a)
。
答案 3 :(得分:1)
(回答我自己的问题只是为了总结一下我认为我学到的东西。)
总之,A &a = ...
和A &&a = ...
之间有什么区别?在const A &a = ...
和const A &&a = ...
之间?如果它们是函数参数的名称,那么它会清楚地影响函数查找,但我只是在讨论局部变量。不同之处是:
const
必须遵守。 const引用不能用于修改对象。A &a = foo();
无法绑定到临时(没有新的),但其他三种形式可以并且将生命周期延长到局部变量。decltype(a)
会有所不同。operator &
或operator &&
个转换可供选择。总之,与我原先假设的差异较小。几个月前,我原以为
A &&a =...;
foo(a);
会致电foo(A&&)
。但是需要foo(move(a))
。
C ++ 03程序员可以相当安全地使用A &&a =
来延长临时工作的生命周期,而不必担心其他意外差异。
(感谢所有人)