C ++ 11(和C ++ 14)STL容器具有noexcept
析构函数和clear()
成员函数。
这意味着元素也应该具有noexcept
析构函数,或者至少存储在容器中的实际元素在销毁时不应抛出任何异常 - 或者更准确地说,相应的allocator_traits<Allocator>::destroy
调用应该不要扔。
这是否在标准的任何地方指定为要求(明确或暗示另一个明确要求)?如果没有,为什么?
我知道is_nothrow_constructible
需要一个noexcept
析构函数,但仅is_constructible
不需要,并且容器需求是根据概念而不是类型特征模板指定的。
答案 0 :(得分:7)
17.6.4.8/1 在某些情况下(替换函数,处理函数,用于实例化标准的类型的操作) 库模板组件),C ++标准库依赖于C ++程序提供的组件。 如果这些组件不符合他们的要求,标准对此没有要求 实施
17.6.4.8/2 特别是,在以下情况下效果未定义:
...
- 如果有任何替换函数或处理函数或析构函数通过异常退出,除非特别允许 适用必需行为:段落。