2013-02-18 21 views
1

暫時擱置移動語義,是標準要求使用放置新建和複製構造函數的向量重新分配和vector :: push_back?如果是這樣的話,它在標準中是這樣說的嗎?是標準要求使用放置新建和複製構造函數的向量重新分配和vector :: push_back?

+0

[「C++ stl容器元素的CopyConstructible」要求的可能的重複](http://stackoverflow.com/questions/6532173/copyconstructible-requirement-for-c-stl-container-element) – LihO 2013-02-18 16:12:55

+0

嗯,它不完全同樣的問題,但我認爲你會發現那裏你正在尋找的一切。 – LihO 2013-02-18 16:15:22

+0

如果我複製,請道歉。但我的理解是,「CopyConstructible」是實現不一定實際使用的要求。 – Tyy 2013-02-18 16:20:17

回答

4

是的,沒有。與所有其他容器一樣,向量需要 使用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)。

+0

似乎這個答案沒有討論是否需要使用複製構造函數的問題? – 2013-02-18 16:51:33

+0

@Alf好點。我忘了提到這一點。但它是否需要;如果庫複製一些東西,將使用複製構造函數。除了它是通過放置新的,如果你使用標準的分配器,並通過你提供的任何其他方式來使用。 – 2013-02-18 17:22:07

0

C++ 11§23.3.6.3,約std::vector::reserve

「如果一個異常被拋出比通過非CopyInsertable類型的移動構造函數其他,沒有影響。 」

這意味着,對於非CopyInsertable項目類型緩衝重新分配,系統的實現是自由移動從舊緩衝到新項目,如果可能的話,那麼不使用類型’的拷貝構造函數。

從移動構造函數異常的影響在上面引述的一段未指定,這是在§23.3.6.5約insertpush_back作出了明確:「如果一個異常是由非的移動構造函數拋出 - CopyInsertableT,效果沒有說明。 」

使用放置新的暗示,因爲’ S中的語言’唯一功能來構造一個對象在預先存在的存儲。正如James Kanze在他的回答中指出的那樣,它也通過對分配器的要求明確要求,並且根據§23.2.1/ 2要求使用分配器’ s construct方法。

相關問題