为什么要为 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/