为什么没有std :: uninitialized_move_if_noexcept?

Dan*_*ica 9 c++ move placement-new noexcept c++17

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(...); 
Run Code Online (Sandbox Code Playgroud)

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

P.W*_*P.W 9

open-std.org上的一篇关于"扩展内存管理工具"论文有一节uninitialized_move介绍了这个问题.

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