分配器构造和destroy成员函数是否允许抛出内部逻辑的异常?

问题描述 投票:0回答:1

我在写自己的容器,需要不抛出可移动和可复制类型。我以为在异常安全方面,我可以简化一下逻辑。但我注意到 constructdestroy 分配器的成员函数没有规定什么时候可以抛出异常,什么时候不能抛出异常。

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

有没有一种措辞,允许只从调用ctordtor抛出异常,还是说分配器总是需要复杂的机械来维护异常安全?

c++ allocator exception-safety
1个回答
1
投票

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

但实际上,他们为什么要这样做呢?

尤其是对于 std::allocator::constructstd::allocator::destroy,它们所做的不过是调用一个构造函数或析构函数。但你应该使用 std::allocator_traits<Alloc>::constructstd::allocator_traits<Alloc>::destroy 反正,这些不过是叫 Alloc::construct Alloc::destroy 如果存在的话,否则就调用constructordestructor。

理论上,一个病态的分配器可以扔进这些成员,但你应该假设他们不会。你无法防御病态愚蠢的类型。

© www.soinside.com 2019 - 2024. All rights reserved.