[英]How to force std::vector to use move constructor instead of the copy one?
[英]are std::vector required to use move instead of copy?
std::vector
是否需要使用move而不是copy,在標准的grow / swap / erase重新分配時? 或者這是純粹的實施優化?
如果std::vector
需要使用move,在什么條件下? 哪些規則/條件可以閱讀?
我發現這個如何在向量增長時強制執行移動語義? 。 但是沒有關於擔保的答案。
UPDATE
什么時候需要在重新分配時使用移動構造函數? 它說它需要重新分配移動語義?
std::vector
是否需要使用move而不是copy,按標准?
我認為你指的是元素的移動和復制。
如果您不使用執行這些操作的成員函數,則根本不需要使用復制或移動。 復制元素需要一些成員函數,移動元素需要其他成員函數。
當需要在重新分配時使用移動構造函數
如果元素不是可復制插入的,則需要使用move(這不需要規則,你不能做你不能做的事情)。 否則,如果移動構造函數可以拋出則需要復制(這是下面引用的強異常保證所要求的)。 如果可以證明非投擲移動,那么它似乎取決於實施,因為我沒有找到任何進一步的保證。 一個好的實現將在noexcept
時移動。
相關功能的例外保證:
如果除非由非CopyInsertable T的移動構造函數拋出異常,則不會產生任何影響。
user2079303的答案很好,但我總結一下,僅供我自己使用。
標准C ++ 17 根本不需要std::vector
在重新分配期間移動。 如果對象是可復制的,它允許始終使用副本。
例如, std::vector<std::vector<std::array<char, 10000>>>
每次都需要復制,當需要在grow上重新分配其元素時。
不要相信庫實現者,總是檢查你的可復制+可移動類型如何在你的環境中使用std::vector
。 它可以是任何東西,因為它允許任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.