为什么使用自定义分配器移动构造函数std::vector
不会noexcept()
从分配器的行为中推断出 a?
这导致封装这种vector的类不能形成在一些<algorithm>
s中可以正常移动的(other)vector。即使底层类型满足必要的要求(MoveInsertable 和 DefaultInsertable)。
为什么使用自定义分配器移动构造函数std::vector
不会noexcept()
从分配器的行为中推断出 a?
这导致封装这种vector的类不能形成在一些<algorithm>
s中可以正常移动的(other)vector。即使底层类型满足必要的要求(MoveInsertable 和 DefaultInsertable)。
我假设“std::vector
使用自定义分配器移动构造函数”是指分配器扩展的移动构造函数,即这个构造函数:
vector(vector&& v, const allocator_type& a);
主要原因是,如果v.get_allocator() != a
那样的话,构造函数必须分配更多的内存,这可能会抛出bad_alloc
. 在编译时无法知道给定类型的两个分配器是否总是比较相等(我已将此报告为缺陷,请参阅LWG 2108)。
注意标准不要求此构造函数或vector(vector&&)
移动构造函数是noexcept
.