2011-07-20 101 views
22

explicit關鍵字建議 所有 構造其可以用一個參數被調用,除了拷貝構造函數。顯式移動構造函數?

對於複製構造函數,它有一個用途(禁止通過函數調用,返回等隱式複製),但它不是通常想要的。

移動構造函數?是否有任何合理的用例使其明確?這裏有什麼好的做法?

+0

「複製構造函數」和「可以用一個參數調用的構造函數」有什麼區別?我對DeadMGs的回答只是有些困惑,因爲我認爲這些都是一樣的。這*只是它被使用的方式,(除了「顯式」)不是如何聲明構造函數,是的?還是我瘋了? – Steve314

+3

@ Steve314:單參數拷貝構造函數特別是構造函數'T([const] [volatile] T&)'。 12.8/2。 'T(int)'是一個可以用一個參數調用的構造函數,但不是複製構造函數,因爲它不會「複製」T的一個實例。 –

+0

@Steve Jessop - 是的,當然。顯然我已經腦死亡了。 – Steve314

回答

19

explicit移動構造函數可影響與例如標準算法。例如,std::swap<T>要求T爲MoveConstructible。反過來,MoveConstructible則以表達式指定,即T u = rv;(其中rvT類型的右值)。

如果既沒有給定類型的非顯式拷貝構造函數也沒有非顯式移動構造函數,那麼T u = rv;是無效的,並且該類型不能與std::swap一起使用。 (然而,在該特定情況下,可以專門提供std::swap以提供期望的功能,例如通過使用T u(rv);)。

簡而言之,一個explicit移動或複製構造函數違背期望值,不能用於泛型代碼。

該放MoveConstructible要求標準庫的一些其它部分:

  • unique_ptr<T, D>
  • 呼叫包裝的刪除器,在例如使用bind(所有都通過了腐朽的類型而言)
  • threadasynccall_once(呼叫包裝方面的所有指定)
  • sortstable_sortnth_elementsort_heap
5

您可能需要大多數用途的隱式移動構造函數。它們通常與複製構造函數屬於相同的類別。顯式不建議用於所有單參數構造函數,但建議大多數。移動構造函數不在該列表中。

5

explicit關鍵字建議(單參數)轉換構造函數,以避免在意想不到的地方出現令人驚訝的轉換。

複製構造函數和移動構造函數在這個意義上並不令人驚訝。它們大部分發生在預期之處如果你不想要它們,我希望它們被標記爲=delete而不是明確的。

2

真正的問題是如何顯式移動構造函數可能被使用?它不能在rvalues上被調用,所以編譯器必須總是選擇一個拷貝構造函數(如果可用的話)或者編譯失敗。

編輯:這裏是鏈接到例如:http://www.ideone.com/nm7KM

+0

[使用直接初始化](http://www.ideone.com/W2BT3)。 –

+0

@Luc:這是一個很好的!也許可以調用顯式移動構造函數的唯一方法。 –

+0

對於一個很好的問題+1,Gene :)還有更多的Luc爲答案的道具(如果你將它添加到你的文章以備將來參考,這可能會很有用)。謝謝! – Kos

0

當值從函數返回,隱式轉移構造通常可以使過程更加高效。

+0

有點偏離主題,但實際上,我認爲這是一個理由讓移動構造函數內聯,如果可能的話。 – Kos