c++ - 为什么 vector 的 move ctor 不推导出 noexcept()?

标签 c++ c++11 g++ move-semantics

为什么要为 std::vector move 构造函数使用自定义分配器不会推断出 noexcept()来自分配器的行为?

这导致封装此类 vector 的类无法形成可以在某些中正常 move 的(其他) vector <algorithm>秒。即使基础类型满足必要的要求(MoveInsertable 和 DefaultInsertable)。

最佳答案

我假设“使用自定义分配器为 std::vector move 构造函数”是指分配器扩展的 move 构造函数,即这个构造函数:

vector(vector&& v, const allocator_type& a);

主要原因是如果 v.get_allocator() != a 那么构造函数必须分配更多的内存,这可能会抛出 bad_alloc。在编译时无法知道给定类型的两个分配器是否总是比较相等(我已将此报告为缺陷,请参阅 LWG 2108)。

注意标准不要求此构造函数 vector(vector&&) move 构造函数为noexcept

关于c++ - 为什么 vector 的 move ctor 不推导出 noexcept()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16141747/

相关文章:

c++ - 检查 QFont 是 Serif 还是 Sans-Serif

c++ - 在 std 算法中否定 boost is_directory

gcc - 我可以在枚举上使用 gcc 可见性属性吗?

c++ - auto 的编译器问题?错误 : in a declarator-list 'auto' must always deduce to the same type

c++ - 我可以覆盖 std::hash 吗?

c++ - 如何在g++中直接访问文本文件的某一部分?

c++ - 自动模板参数 : g++ 7. 3 vs clang++ 6.0 : Which compiler is correct?

C++:MsiOpenDatabase 失败并出现错误 110 0x6e ERROR_OPEN_FAILED 仅当提升/管理时

c++ - 这个 typedef 是如何工作的?

c++ - c++20中类模板构造函数可以有冗余模板参数列表吗