1

现在抛开移动语义,标准是否需要vector重新分配和vector::push_back才能使用placement new和copy构造函数?如果是这样,标准中的哪里是这样说的?

4

2 回答 2

4

是和不是。与所有其他容器一样,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)需要默认分配器。

于 2013-02-18T16:18:08.563 回答
0

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

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

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

来自移动构造函数的异常的影响在上面引用的段落中未指定,这在第 23.3.6.5 节中明确说明insertand push_back:“如果非移动构造函数抛出异常CopyInsertable T,则未指定影响。”

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

于 2013-02-18T16:44:02.127 回答