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中引入有什么特殊的原因吗?
发布于 2018-10-23 07:29:46
一篇关于“扩展内存管理工具” at open-std.org的论文有一个关于uninitialized_move的章节,讨论这个问题。
对于
uninitialized_move的异常处理提出了一些关注。如果移动构造函数抛出,源对象可能已被不可挽回地损坏。由于没有解决这个问题的方法,我们实现了销毁目标缓冲区中所有完全构造的对象并传播异常的自然语义和预期语义。这尽可能地与uninitialized_copy的行为相匹配。作为一种附加的算法,uninitialized_move_if_noexcept**,可以被认为是对的一种解决方案。这样的算法已经在libstdc++中使用move_if_noexcept迭代器实现了。考虑到目前还没有基于范围的move_if_noexcept算法,这样的解决方案在这里并不是考虑的。显然,这样一个特性是很容易实现的,然而。
https://stackoverflow.com/questions/52943287
复制相似问题