是标准所要求的向量重新分配和向量::push_back,以使用placementnew和copy构造函数

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

本文关键字:向量 back push 构造函数 copy placementnew 标准 分配 新分配      更新时间:2023-10-16

抛开move语义不谈,使用placement-new和copy构造函数的标准是否需要向量重新分配和向量::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)和使用新位置(§20.6.9.1/12)。

C++11§23.3.6.3,关于std::vector::reserve:

“如果不是由非CopyInsertable类型的move构造函数引发异常,则不会产生任何影响”

这意味着,对于具有非CopyInsertable项类型的缓冲区重新分配,实现可以自由地项从旧缓冲区移动到新缓冲区,如果可能,则不使用类型’s复制构造函数。

在上面引用的段落中,移动构造函数的异常的影响没有明确说明,这在关于insertpush_back的§23.3.6.5中明确规定:“如果非CopyInsertable T的move构造函数引发异常,则其影响是未指定的”

使用新职位是隐含的,因为;语言是什么;在预先存在的存储中构造对象的唯一功能。正如James Kanze在回答中指出的那样;s也明确要求通过分配器的要求,以及§23.2.1/2要求分配器;s的CCD_ 11方法。