标准容器的异常要求

16

C++11 §23.2.1.10 规定:

除非有特别指定,否则本条款中定义的所有容器类型均满足以下附加要求:

  • 如果向容器插入单个元素时 insert() 或 emplace() 函数引发异常,则该函数不会产生任何影响。
  • no erase()、clear()、pop_back() 或 pop_front() 函数会引发异常。

关于第一个要点,容器如何保证这一点?T 的构造函数可能具有副作用。难道不应该是“对容器没有影响”吗?

关于第二个要点,这通常会调用不是 noexceptallocator::deallocate(T*,size_t)。为什么应该掩盖掉潜在的异常呢?


1
这些问题放在 std-discussion 讨论区不是更合适吗? - Lightness Races in Orbit
4
deallocate() 必须保证不会抛出异常。 - T.C.
1
在分配器要求表([allocator.requirements])中查找“deallocate”。 - T.C.
2
也许有人能想出一个更好的标题来... @LightnessRacesinOrbit - Marco13
1
标准中有很多地方在说“没有影响”时,并不完全意味着“任何地方都没有影响”。例如,“uninitialized_meow”函数。 - T.C.
显示剩余8条评论
1个回答

7

第28个表格规定,分配器的要求之一是deallocate()“不抛出异常”。这就是标准如何对erase()clear()pop_back()pop_front()进行断言的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接