4

在第 17 项中exceptional c++,我发现:

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

但在第 1 项中effective STL,我发现:

如果您需要多元素插入的事务语义(例如,范围形式 — 参见第 5 条),您将需要选择 list,因为 list 是唯一为多元素插入提供事务语义的标准容器。

在页面249the c++ standard library 2th,我发现:

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

所以我的问题是哪一个是对的?强异常安全意味着与事务安全相同吗?

4

2 回答 2

3
  1. 哪一个是对的?

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

例外

如果抛出异常,则没有任何影响(强异常保证)。

从标准来看,$23.3.5.4/2 list modifiers [list.modifiers]

如果抛出异常,则没有任何影响。

然后

  1. 强异常安全意味着与事务安全相同吗?

是的。是 Herb Sutter 的解释:

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

于 2016-04-06T14:07:01.853 回答
1

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

您可以提供此保证,因为 list 具有恒定复杂度的合并操作,这是一个非抛出操作。您需要做的就是首先创建一个临时列表,用值填充临时列表,然后将临时列表合并到原始列表中。

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

由于没有其他容器提供恒定复杂性的无抛出合并,因此任何其他容器都不可能。

于 2016-04-06T14:18:29.533 回答