2013-11-09 27 views

回答

5

交換技巧是確保exception safety相當簡單的方法。

如果您按字段複製並在中間得到異常,那麼您的對象最終會處於不一致的狀態(除非您採取措施解決此問題,這可能會使事情變得複雜)。

使用基於交換的實現,如果Foo temporary (other)引發,您的對象保持原來的狀態不變。

+0

但是從鏈接的例子中,他們並沒有用這個交換爲了複製構造函數..爲什麼? – texasbruce

+0

@texasbruce:構造函數是不同的。如果通過構造函數中途拋出異常,部分構造的對象將在異常傳播到調用堆棧之前自動正確銷燬。 – NPE

0

這是爲了避免不一致的狀態或更好的詞語,我們會說,使異常安全。

您還可以檢查此相關的主題: - What is the copy-and-swap idiom?

如上線程提及GManNickG: -

它通過使用拷貝構造函數的功能來創建的 本地副本數據,然後用交換功能將複製的數據取出,將舊數據與新數據交換。臨時副本 然後破壞,取出舊數據。我們留下了新數據的副本 。

爲了使用複製和交換成語,我們需要三樣東西:一個 工作拷貝構造,工作析構函數(兩者都是 任何包裝的基礎,所以應該是完整反正),和交換功能。

交換函數是一個非拋出函數,用於交換成員的成員成員 類的兩個對象。我們可能會試圖用std :: swap代替 來提供我們自己的,但這是不可能的; std :: swap在其 實現中使用 複製構造函數和複製賦值運算符,並且我們最終會試圖根據自身定義賦值運算符 !

還要檢查Why do some people use swap for move assignments?

1

此外,爲使複製省略和(C++ 11)移動語義:

Foo& operator= (Foo other) { 
    std::swap(data, other.data); 
    return *this; 
} 
+0

這個舉動在哪裏? – texasbruce

+0

@texasbruce複製elision或移動將在'其他'的建設 –

+0

我看到..當你通過參數的權利?它很聰明,但爲什麼很多人使用這種方法? – texasbruce

相關問題