答案 0 :(得分:4)
是和否。像所有其他容器一样,矢量是必需的
使用allocator_traits<allocator_type>::construct
和
allocator_traits<allocator_type>::destroy
(§23.2.1/ 3)和
使用分配器获取所有内存(第23.2.1 / 7节)。如果你
提供自定义分配器,你可以做任何事情。该
调用::operator new
需要默认分配器
(§20.6.9.1/ 6)并使用新的放置(§20.6.9.1/ 12)。
答案 1 :(得分:0)
C ++11§23.3.6.3,关于
std::vector::reserve
:“如果除了非
CopyInsertable
类型的移动构造函数之外抛出异常,则没有效果。”
这意味着对于具有非CopyInsertable
项类型的缓冲区重新分配,如果可能的话,实现可以自由地将项从旧缓冲区移动到新缓冲区,然后不使用类型的复制构造函数。
上面引用的段落中未指明移动构造函数的异常的影响,并且在§23.3.6.5中明确说明了insert
和push_back
:“如果抛出异常通过非CopyInsertable
T
的移动构造函数,效果未指定。“
隐含使用placement new,因为这是语言在预先存在的存储中构造对象的唯一功能。正如James Kanze在他的回答中指出的那样,它也明确要求通过分配器的要求,并通过§23.2.1/ 2要求使用分配器的construct
方法。