是否有任何一点将局部变量命名为rvalue-ref?

时间:2011-12-20 04:24:02

标签: c++ c++11 rvalue-reference

假设代码编译,之间有什么区别:

A && a = .....

A &  a = .....

a是函数或方法中的局部变量,而不是参数。

通过给rvalue-reference一个名称(a),它实际上是范围其余部分的左值?即使使用前一种形式,在将move(a)传递给另一个函数时,您必须使用a来启用盗窃?

我很欣赏第二种形式可能存在其他问题,这会阻止编译,例如,您不能对临时文件进行(非常量)引用。所以,是的,我很想知道所有的差异,但首先我要确认我的预感,它们完全等同于范围的其余部分。

更新:作为@KerrekSB重申的“临时”问题的一个示例,有时您必须使用简单引用const。在这种情况下,我的问题是:

之间是否存在差异
const A && a = .....

const A &  a = .....

4 个答案:

答案 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 = ...之间?如果它们是函数参数的名称,那么它会清楚地影响函数查找,但我只是在讨论局部变量。不同之处是:

  1. (明显)const必须遵守。 const引用不能用于修改对象。
  2. A &a = foo();无法绑定到临时(没有新的),但其他三种形式可以并且将生命周期延长到局部变量。
  3. decltype(a)会有所不同。
  4. (假设没有const问题),初始化可能会相同,除非有operator &operator &&个转换可供选择。
  5. 总之,与我原先假设的差异较小。几个月前,我原以为

    A &&a =...;
    foo(a);
    

    会致电foo(A&&)。但是需要foo(move(a))

    C ++ 03程序员可以相当安全地使用A &&a =来延长临时工作的生命周期,而不必担心其他意外差异。

    (感谢所有人)