在exceptional c++
的第17项中,我发现了这个:
首先,对于所有容器,多元素插入("迭代器范围" 插入)绝不是强烈异常安全的。
但在effective STL
的第1项中,我发现了这一点:
如果需要多元素插入的事务语义 (例如,范围形式 - 见第5项),你想要选择列表, 因为list是唯一提供事务的标准容器 多元素插入的语义。
在249
的{{1}}页面中,我发现了这一点:
对于列表,即使是多元素插入操作也是事务安全的。
所以我的问题是哪一个是对的?强烈特殊安全意味着与交易安全相同吗?
答案 0 :(得分:3)
- 哪一个是对的?
醇>
对于std::list::insert
的所有重载,保证了极强的异常安全性。
例外
如果抛出异常,则没有效果(强异常保证)。
并从标准$23.3.5.4/2 list modifiers [list.modifiers]
:
如果抛出异常,则没有效果。
然后
- 非常特殊 - 安全意味着与交易安全相同吗?
醇>
是。 Here来自Herb Sutter的解释:
强保证:如果抛出异常,程序状态保持不变。此级别始终隐含全局提交或回滚语义,包括如果操作失败,则容器中的引用或迭代器无效。
答案 1 :(得分:1)
已经回答std::list
按照标准提供此保证。我想提及为什么可以在列表中执行此操作。
您可以提供此保证,因为列表具有常量复杂性合并操作,这是一种非投掷操作。您需要做的就是先创建一个临时列表,用值填充临时列表,然后将临时列表合并到原始列表中。
如果在填充临时列表时发生异常,则不会合并任何内容,并且在插入退出时会简单地处理临时列表。
由于没有其他容器提供持续复杂的无投掷合并,因此任何其他容器都无法实现。