2016-04-06 47 views
3

在17 exceptional c++項目,我覺得這一點:是std :: list的多元素插入強烈異常安全?

首先,對於所有容器,多元素插入(「迭代範圍」 插入)永遠不會強烈異常安全。

但在1 effective STL項目,我覺得這一點:

如果你需要多元素插入事務語義 (例如,區間形式 - 見第5條),你會想以選擇列表 ,因爲列表是唯一標準容器,它爲多元素插入提供事務性的 語義。

249the c++ standard library 2th頁面,我發現這一點:

對於列表,甚至是多個元素的插入操作是交易安全的。

所以我的問題是哪一個是對的?強烈的例外安全意味着交易安全嗎?

回答

2
  1. 哪一個是對的?

對於std::list::insert的所有重載,強烈的異常安全保證。

例外

如果拋出一個異常,沒有影響(強異常保證)。

,並從標準,$23.3.5.4/2 list modifiers [list.modifiers]

如果拋出一個異常,沒有影響。

然後

  • 強烈特殊安全裝置與交易相同的安全嗎?
  • 是的。 Here來自Herb Sutter的解釋:

    強有力的保證:如果拋出異常,程序狀態保持不變。這個級別總是意味着全局提交或回滾語義,包括如果操作失敗,那麼容器中的引用或迭代器就不會失效。

    +0

    so herb sutter對此有錯誤嗎? – guorongfei

    +0

    @郭榮飛是的,很清楚。 – songyuanyao

    1

    已經回答說std::list提供了這個保證按照標準。我想提爲什麼有可能在列表中做到這一點。

    您可以提供此保證,因爲列表具有不變的複雜性合併操作,這是一種非拋出操作。您只需首先創建一個臨時列表,使用值填充臨時列表,然後將臨時列表合併到原始列表中。

    如果在填充臨時列表時發生異常,則不會合並任何東西,並且在插入退出時簡單地放置臨時列表。

    由於沒有其他容器提供不變的複雜性無投擲合併,所以不能與任何其他容器一起使用。