c++ - 为什么没有 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 中引入吗?
解决方案
open-std.org上的一篇关于“扩展内存管理工具”的论文有一个部分讨论了这个问题。uninitialized_move
关于
uninitialized_move
. 如果移动构造函数抛出,则源对象可能已被不可挽回地损坏。由于这个问题没有解决方案,我们实现了自然和预期的语义,即销毁目标缓冲区中所有完全构造的对象并传播异常。uninitialized_copy
这与尽可能接近 的行为相匹配。可以考虑另一种算法uninitialized_move_if_noexcept
来解决这个问题。这样的算法已经在 libstdc++ 中使用move_if_noexcept
迭代器实现了。鉴于目前没有基于范围的move_if_noexcept
算法,这里不考虑这样的解决方案。然而,很明显,这样的功能很容易实现。
推荐阅读
- asp.net-core - DBContext 构造函数中的用户声明有时为空
- continuous-integration - 无法添加 gitlab CI/CD 变量
- php - 无法在 docker 映像中找到包
- python - 如何使用 Python 从货币符号中推断/打印货币代码?
- javascript - Anime.js 动画不工作,(动画没有启动)
- mysql - 无法连接mysql
- numpy - 为什么 .apply() 不像我期望的那样应用旋转?
- angular - Angular 10:数据未插入数据库
- python - 检查列表中的重复字母
- java - Swift 中的 IntStream 等价性