9

为什么使用自定义分配器移动构造函数std::vector不会noexcept()从分配器的行为中推断出 a?

这导致封装这种vector的类不能形成在一些<algorithm>s中可以正常移动的(other)vector。即使底层类型满足必要的要求(MoveInsertable 和 DefaultInsertable)。

4

1 回答 1

4

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

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

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

注意标准不要求此构造函数vector(vector&&)移动构造函数是noexcept.

于 2013-04-22T12:13:32.143 回答