std :: list的多元素插入是否强烈异常安全?

时间:2016-04-06 13:58:41

标签: c++ insert language-lawyer stdlist exception-safety

exceptional c++的第17项中,我发现了这个:

  

首先,对于所有容器,多元素插入("迭代器范围"   插入)绝不是强烈异常安全的。

但在effective STL的第1项中,我发现了这一点:

  

如果需要多元素插入的事务语义   (例如,范围形式 - 见第5项),你想要选择列表,   因为list是唯一提供事务的标准容器   多元素插入的语义。

249的{​​{1}}页面中,我发现了这一点:

  

对于列表,即使是多元素插入操作也是事务安全的。

所以我的问题是哪一个是对的?强烈特殊安全意味着与交易安全相同吗?

2 个答案:

答案 0 :(得分:3)

  
      
  1. 哪一个是对的?
  2.   

对于std::list::insert的所有重载,保证了极强的异常安全性。

  

例外

     

如果抛出异常,则没有效果(强异常保证)。

并从标准$23.3.5.4/2 list modifiers [list.modifiers]

开始
  

如果抛出异常,则没有效果。

然后

  
      
  1. 非常特殊 - 安全意味着与交易安全相同吗?
  2.   

是。 Here来自Herb Sutter的解释:

  

强保证:如果抛出异常,程序状态保持不变。此级别始终隐含全局提交或回滚语义,包括如果操作失败,则容器中的引用或迭代器无效。

答案 1 :(得分:1)

已经回答std::list按照标准提供此保证。我想提及为什么可以在列表中执行此操作。

您可以提供此保证,因为列表具有常量复杂性合并操作,这是一种非投掷操作。您需要做的就是先创建一个临时列表,用值填充临时列表,然后将临时列表合并到原始列表中。

如果在填充临时列表时发生异常,则不会合并任何内容,并且在插入退出时会简单地处理临时列表。

由于没有其他容器提供持续复杂的无投掷合并,因此任何其他容器都无法实现。