为什么使用自定义分配器移动std::vector
的构造函数不会从分配器的行为中推导出noexcept()
?
这导致封装这种向量的类不能形成通常在某些<algorithm>
中移动的(其他)向量。即使基础类型满足nessesary要求(MoveInsertable和DefaultInsertable)。
答案 0 :(得分:4)
我假设通过“使用自定义分配器移动std::vector
的构造函数”,你的意思是 allocator-extended移动构造函数,即这个构造函数:
vector(vector&& v, const allocator_type& a);
主要原因是如果v.get_allocator() != a
那么构造函数必须分配更多内存,这可能会抛出bad_alloc
。在编译时无法知道给定类型的两个分配器是否总是比较相等(我已将此报告为缺陷,请参阅LWG 2108)。
N.B。该标准不要求此构造函数或 vector(vector&&)
移动构造函数为noexcept
。