繁体   English   中英

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

[英]is vector reallocation and vector::push_back required by the standard to use placement new and copy constructor?

暂且不谈移动语义,这是标准要求的向量重新分配和vector :: push_back使用放置新建和复制构造函数吗? 如果是这样,标准中的哪个位置如此?

是的,不是。 与所有其他容器一样,Vector需要使用allocator_traits<allocator_type>::constructallocator_traits<allocator_type>::destroy (§23.2.1/ 3)并使用分配器获取所有内存(§23.2.1/ 7) 。 如果您提供自定义分配器,您可以执行任何操作。 默认分配器需要调用::operator new (第20.6.9.1 / 6节)并使用placement new(第20.6.9.1 / 12节)。

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方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM