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

Ori*_*ent 9 c++ g++ move-semantics c++11

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

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

Jon*_*ely 4

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

vector(vector&& v, const allocator_type& a);
Run Code Online (Sandbox Code Playgroud)

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

请注意,该标准不要求此构造函数移动构造vector(vector&&)函数为noexcept