const T&与T&&

时间:2013-02-10 01:01:45

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

我有以下功能:

T foo();

而且,在另一个函数中,我正在使用返回的T值,例如:

const T& t = foo();

T&& t = foo();

我想问:

  1. 两者都是等价的吗?

  2. 记忆方面,这两种方法有什么区别?

  3. 我知道在第一种方法中,临时值生命周期与参考生命周期匹配。使用右值参考时会出现同样的情况吗?

  4. 我是否应该考虑使用const rvalue引用(const T&&)?

  5. 我正在使用第一种方法,这就是我习惯的并且很好地照顾我。我仍然围绕右值参考和C ++ 11货物。

3 个答案:

答案 0 :(得分:5)

  1. 不,他们有不同的类型。

  2. 实施定义,但不太可能有任何区别。

  3. 对于右值和左值引用,Lifetime扩展的工作方式相同。但规则比“临时值生命周期与参考生命周期匹配”更复杂。

  4. 可能不是。我当然不会去寻找使用它的地方。如果你有使用它,最好是如此显着的改进来证明使用这种不寻常的组合以及将来人们阅读它时会产生的混乱。

答案 1 :(得分:1)

  1. 它们基本相同(临时适用的终身延伸),但一个是const,一个不是。
  2. “记忆明智”可能没有任何区别,但这依赖于实现。
  3. 我无法想象你想要的那种情况。
  4. 但是,移动语义确实使你使用的技术过时了。它最初的目的是让人们避免制作不必要的副本,但现在使用移动语义,以前的代价实际上是免费且更具可读性。

答案 2 :(得分:1)

如果您想知道何时以及是否使用&&,我强烈建议您观看

http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Scott-Meyers-Universal-References-in-Cpp11

Imho,绝对值得投入时间。

据我所知:

1 + 2)取决于T

的类型

3)对参考值的寿命没有影响。旁注:无论 T&& 最终都是类型,它现在都有一个名字: t ,因此是一个l值。

4)对我自己有点:你是如何从常规的东西中移动的?

最佳Jochen

编辑:添加空行。