2012-02-12 28 views
13

我一直在閱讀一些矛盾的文章,關於是否允許移動構造函數/賦值。移動構造函數是否被要求爲noexcept?

因此,我想問一下,移動構造函數/賦值是否允許拋出最終的C++ 11標準?

+0

我沒有看到關於移動構造函數不允許拋出的標準中的任何內容,但我確實看到「類X的隱式聲明的移動構造函數的形式爲 'X :: X(X &&)'' 「,我在那裏看不到」不接受「。 – 2012-02-12 15:15:00

+0

在最後的草稿中,我沒有看到針對任何函數聲明瞭'noexcept' ... – ronag 2012-02-12 15:20:31

+0

@ronag:你確定你在看?因爲我打開了N3337,並且只搜索了「'noexcept」,並立即獲得了一些類的「交換」功能。 – 2012-02-12 17:03:29

回答

17

移動構造函數一般允許拋出嗎?是。 應該他們?一般來說,你所做的任何事情都不應該是任何可能拋出的東西。你不應該分配內存,調用其他代碼或類似的東西。編寫移動構造函數的唯一原因是與其他人的內存指針和對象引用一起潛伏。您應該複製一些基本類型並將其他對象中的值歸零。那些東西不應該扔掉。

所以儘管它被允許,但這不是一個好主意。如果你這樣做,重新考慮你在移動操作中做了什麼。

+0

我認爲沒有stl類型扔在移動構造函數?我應該擔心的唯一的地方是美元? – ronag 2012-02-12 17:10:12

+6

@ronag:如果std :: type在其移動構造函數中沒有'noexcept',則允許拋出。特別是,基於節點的容器的某些實現具有投擲移動構造器,因爲每個容器都必須包含堆分配的末端節點,甚至是空容器。這些相同容器的其他實現沒有這種設計,因此可以(並且被允許)具有noexcept移動構造函數。 – 2012-02-12 17:27:22

相關問題