2

我正在编写自己的容器,该容器不需要可移动和可复制的类型。我认为在异常安全方面我可以稍微简化逻辑。但是我注意到分配器constructdestroy成员函数没有关于何时可以和不能抛出异常的措辞。

我很确定我以前读过这些措辞。否则,即使我的类型不可移动,construct当我调整缓冲区大小以增加容量时,仍然可以从用户提供的分配器中抛出异常。这需要复杂的回滚代码来保证我真正想跳过的强大的异常安全性。

是否有一种措辞只允许从调用 ctor/dtor 时抛出异常,或者分配器是否总是需要复杂的机制来维护异常安全?

4

1 回答 1

2

分配器成员可以抛出。如果标准没有说他们不能扔,那么他们可以扔。

但在实践中,他们为什么会这样做?

特别是对于std::allocator::constructand std::allocator::destroy,它只是调用构造函数或析构函数。但是无论如何你都应该使用std::allocator_traits<Alloc>::constructand ,如果存在的话,它们只会调用 / ,否则调用构造函数/析构函数。std::allocator_traits<Alloc>::destroyAlloc::constructAlloc::destroy

从理论上讲,病态分配器可以加入这些成员,但您应该假设它们不会。你无法防御病态愚蠢的类型。

于 2020-05-29T20:40:31.017 回答