2013-02-10 75 views
5

我有以下功能:常量T&与T &&

T foo(); 

而且,在其他功能,我玩返回T值,如:

const T& t = foo(); 

T&& t = foo(); 

我想问:

  1. 两者是否相等?

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

  3. 我知道,在第一种方法的临时值寿命的寿命基准时间相匹配。使用右值引用时会发生同样的情况吗?

  4. 应我甚至考虑使用一个const右值引用(const T&&)?

我正在使用第一种方法,那就是我习惯的并且很好地服从我。我仍然围绕右值引用和C++ 11商品进行包装。

+2

仅仅因为你可以创建一个局部右值引用变量并不意味着它是有用的。它们主要用于参数,偶尔会返回值。 – 2013-02-10 01:08:25

+0

“T”是否是推断类型?这是一个很大的区别。 – 2013-02-10 01:14:52

+0

@sftrabbit:好点。我认为这个问题意味着'T &&'实际上是一个r值参考,不受参考折叠规则的约束。 – 2013-02-10 01:20:40

回答

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

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

  3. 生存期扩展工程右值和左值引用相同。但是该规则比“临时值寿命与参考寿命匹配”更复杂。

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

1
  1. 他们基本上是相同的(临时工的寿命延长适用),但一个是const有一个没有了。
  2. “内存明智”可能没有任何区别,但这取决于实现。
  3. 是的。
  4. 我无法想象一个你想要的案例。

但是,移动语义确实会让你使用的技术过时。它最初的目的是让人们避免制造不必要的副本,但现在用移动语义,现在实际上免费且更易读的东西会变得昂贵。

+0

回复:'移动语义使这个过时':如果'T'有一个合适的移动赋值操作符,你可以简单地写'T t = foo();'而不需要任何不必要的副本,对吧? – us2012 2013-02-10 01:16:09

+1

@ us2012否,在'T t = foo()'赋值运算符是不相关的。这将是移动构造函数。然而,编译器甚至可能会退出,所以甚至不会发生。 – 2013-02-10 01:16:53

1

如果你有没有想过何时以及是否使用& &,我强烈建议看

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

恕我直言,这是definitly值得投资的时间。

我的理解:

1 + 2)取决于类型T

3)关闭参考值上的寿命没有影响。附注:无论如何T & &最后是类型明智的,它现在有一个名字:t,因此是一个l值。

4)一种针对自己的方式:你如何从常量中移动?

最好Jochen

编辑:添加空白行。

相关问题