是标准要求的向量重新分配和vector :: push_back使用placement new和copy构造函数吗?

时间:2013-02-18 16:10:03

标签: c++ stl

暂时不考虑移动语义,是标准要求使用放置新建和复制构造函数的向量重新分配和vector :: push_back吗?如果是这样,标准中的哪个地方这样说呢?

2 个答案:

答案 0 :(得分:4)

是和否。像所有其他容器一样,矢量是必需的 使用allocator_traits<allocator_type>::constructallocator_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中明确说明了insertpush_back:“如果抛出异常通过非CopyInsertable T的移动构造函数,效果未指定。“

隐含使用placement new,因为这是语言在预先存在的存储中构造对象的唯一功能。正如James Kanze在他的回答中指出的那样,它也明确要求通过分配器的要求,并通过§23.2.1/ 2要求使用分配器的construct方法。