如何解决std::vector 在需要重新分配时如何知道它是否可以利用移动语义
我猜 std::vector
在将元素复制/移动到重新分配的缓冲区时使用了 allocator_traits::construct
。
那么我认为需要评估函数是否抛出异常,来决定重新分配的策略。但(对我而言)似乎很难做到。
如果它使用新的位置(而不是 allocator_traits::construct
),这不会是一个问题,std::is_nothrow_move_constructible<value_type>
可以完成这项工作。
补充:
让我补充一些信息。我希望这能澄清我的问题的意图。
我的问题涉及在重新分配策略方面确保 std::vector
之类的容器的异常保证的机制。
通常,在重新分配时,此类容器无法移动代码路径中的元素,如果它宣传强异常保证,则可能会抛出。
基于以上,有一个东西叫做AllocatorAwareContainer。它说
一个 AllocatorAwareContainer 是一个容器,它包含一个 Allocator 的实例,并在其所有成员函数中使用该实例来分配和释放内存以及构造和销毁该内存中的对象
我对其进行了翻译,以便分配器感知容器在将元素复制/移动到重新分配的缓冲区时需要使用 allocator_traits::construct
。因此,容器实现者需要知道函数以std::allocator_traits<allocator_type>::construct(a,p,std::move(elem))
的形式调用时是否抛出。这里重要的是 allocator_traits::construct
是一个自定义点。因此,即使 std::is_nothrow_move_constructible_v
更新:
我发现了一个相关的问题 here。
根据那里的答案和评论,标准中似乎存在缺陷。正因为如此,std::vector
的异常安全性被削弱了。
我们现在能做的是,只希望 allocator_traits::construct
在 std::is_nothrow_move_constructible_v
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。