[英]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>::construct
和allocator_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节中明确说明了insert
和push_back
:“如果非CopyInsertable
T
的移动构造函数抛出异常,效果未明确。“
隐含使用placement new是因为这是语言在预先存在的存储中构造对象的唯一功能。 正如James Kanze在他的回答中指出的那样,它也明确要求通过分配器的要求,并通过§23.2.1/ 2要求使用分配器的construct
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.