2013-02-10 70 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

編輯:添加空白行。

相關問題