为什么vector的移动ctor没有推导出noexcept()?

时间:2013-04-22 07:36:32

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

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

这导致封装这种向量的类不能形成通常在某些<algorithm>中移动的(其他)向量。即使基础类型满足nessesary要求(MoveInsertable和DefaultInsertable)。

1 个答案:

答案 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