5

我有以下功能:

T foo();

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

const T& t = foo();

或者

T&& t = foo();

我想问一下:

  1. 两者是等价的吗?

  2. 在内存方面,这两种方法有什么区别?

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

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

我正在使用第一种方法,这就是我习惯并且很好地照顾我的方法。我仍然围绕右值引用和 C++11 商品。

4

3 回答 3

5
  1. 不,它们有不同的类型。

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

  3. 右值和左值引用的生命周期扩展工作相同。但是这个规则比“临时值生命周期匹配引用生命周期”更复杂。

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

于 2013-02-10T01:14:24.777 回答
1
  1. 它们基本相同(适用于临时工的终身延长),但一个是const,一个不是。
  2. “内存方面”可能没有任何区别,但这取决于实现。
  3. 是的。
  4. 我无法想象你想要的情况。

但是,移动语义确实使您使用的技术过时了。它最初的目的是让人们避免制作不必要的副本,但现在有了移动语义,以前昂贵的东西现在实际上是免费的,并且更具可读性。

于 2013-02-10T01:14:28.277 回答
1

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

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

恕我直言,绝对值得投入时间。

据我了解:

1+2) 取决于 T 的类型

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

4) 有点针对我自己:你是如何摆脱 const 的?

最好的约臣

编辑:添加空行。

于 2013-02-10T09:43:57.500 回答