2012-08-03 89 views
6

在C++中,不能依賴從return語句調用的複製構造函數,因爲標準中的特殊子句允許編譯器省略對由return語句,即使拷貝構造函數有副作用。因此,編寫一個複製構造函數是不好的風格,它不僅僅是複製構造實例。帶有副作用的C++ 11移動構造函數

C++ 11標準中是否存在類似的語句,它允許編譯器在某些情況下消除對移動構造函數的調用 - 如果有,那些情況是什麼?

+0

謝謝。問題全部回答。今天學到了很多!第一個(幾秒鐘)是@Xeo。這將是正確的答案。所有答案+1 – ritter 2012-08-03 17:18:50

回答

9

Copy-elision同樣適用於移動施工,它是完全相同的條款,並且複製構造和移動構造的縮寫統稱爲「copy-elision」。

§12.8 [class.copy] p31

當滿足特定條件時,一種實現被允許省略一個類對象的拷貝/ 移動施工,即使複製/ 移動構造和/或析構對象有副作用。 [...]

3

當允許複製elision時,將不執行復制,因此即使對象是可移動的,也不會執行復制構造函數的調用。因此,複製elision勝過移動,並且當它發生時,您不能確定(至少不是以便攜的方式)。所以這是一個場景,當移動複製建設的副作用是一個壞主意。

1

Elision對於複製和移動都是相同的。該標準沒有任何具體的移動措辭,因爲它們的定義完全相同。

相關問題