簡體   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