首页 > 解决方案 > 为什么没有 std::uninitialized_move_if_noexcept?

问题描述

C++17 增加了std::uninitialized_move,但内部没有std::uninitialized_move_if_noexcept使用std::move_if_noexcept。在我看来,这会很有用,因为现在,如果我们想重新分配,我们仍然需要写一些东西

if constexpr (!std::is_nothrow_move_constructible_v<value_type>
              && std::is_copy_constructible_v<value_type>)
  std::uninitialized_copy(...);
else 
  std::uninitialized_move(...); 

有什么特别的原因std::uninitialized_move_if_noexcept没有在 C++17 中引入吗?

标签: c++c++17moveplacement-newnoexcept

解决方案


open-std.org上的一篇关于“扩展内存管理工具”的论文有一个部分讨论了这个问题。uninitialized_move

关于uninitialized_move. 如果移动构造函数抛出,则源对象可能已被不可挽回地损坏。由于这个问题没有解决方案,我们实现了自然和预期的语义,即销毁目标缓冲区中所有完全构造的对象并传播异常。uninitialized_copy这与尽可能接近 的行为相匹配。可以考虑另一种算法uninitialized_move_if_noexcept来解决这个问题。这样的算法已经在 libstdc++ 中使用move_if_noexcept迭代器实现了。鉴于目前没有基于范围的move_if_noexcept算法,这里不考虑这样的解决方案。然而,很明显,这样的功能很容易实现。


推荐阅读