2014-03-19 23 views
-2

我讀了一些文章關於C++ 11移動語義C++ 11會導致我重寫下面的一些方法嗎?

現在我有更多的問題

  1. 我需要增加一個拷貝構造

    ClassA(const ClassA&&)

  2. 我是否需要加一個=覆蓋

    like operator=(ClassA&&)

我需要的其他更改嗎?

或移動語義完全是關於編譯器優化,我不需要做任何事情?

+0

您應該爲包含大量數據的任何事物添加移動語義,並且您打算製作臨時副本(如通過某些函數的值返回)。你可以定義並複製和移動構造函數,所以你不會重寫任何東西。 – Ben

+0

據我所知,'const ClassA &&'應該是非法的,或者至少不會做你期望的。移動語義通常會改變傳遞的對象,這與傳遞'const'引用的觀點相反。 – anderas

+0

謝謝,並改變了問題。 –

回答

3

R值參考(&&)在C++ 03中不存在,如果您的類有一個副本,並且C++ 11不會生成移動控制器,並且如果您的類沒有生成傳輸分配作爲一個分配。

所以,如果你只是讓你的代碼保持原樣,它就會像C++ 03一樣工作。

Cosider,對於沒有定義構造函數,並指定一個類時,編譯器會生成一些默認impementations是

  • class::class() - 通常默認情況下,調用基地和成員的默認值。
  • class::class(const class&) - 通常副本,調用基地,成員由成員複製
  • class::class(class&&) - 「移動構造函數」,調用基地和成員逐件移動
  • class& class::operator=(const class&) - 通常可以指定由副本該呼叫基地和構件逐構件複製
  • class& class::operator=(lass&&) - 通過轉移的分配,通過部件傳送
  • class::~class()的析構函數,在相反的順序呼叫mebers和鹼sdtor調用鹼和構件。

現在,如果你實現剛纔複製的舉動默認一個與同時轉讓一起刪除,導致無論「移動」操作(複製或指定臨時或「強制轉換爲臨時的)綁定到一個副本,從而恢復舊的C++ 03的行爲。

如果impememnt只是「移動」,複製(和分配)被刪除,從而導致你的類是「只moavable」(就像std::unique_ptr,例如)

如果你實施他們兩個,那麼它取決於你defi ne如何移動不同於複製

+0

在複製構造函數中,我使用a = rhl.a; b = rhl.b;如何使用移動構造函數實現? –

+0

@AdamLee:':a(rhl.a); b(rhl.b){}'。事實上,就像你應該在你的拷貝中一樣。但是,如果你只是做成員複製,爲什麼你甚至會擁有一個副本? – MSalters

+0

移動構造函數只對右值有用,對嗎?如果我有一個L值,我需要同時移動ctor和copy ctor? –

0

你試過

class(class&& other) = default; class(const class& other) = default;

當心這將工作僅在類的所有成員都是可移動/可複製。 如果使用默認的「複製缺陷」,指針將指向與原始位置相同的位置。用來。

正如@Emilio所說,如果您自己定義了Copy Ctor,那麼它不適合要求編譯器生成默認的Move Ctor,因爲這可能會導致問題。

相關問題