[英]Move assignment on containers: state of previously contained objects
來自另一個問題 (實際上是這個 問題 ,但是前一個是更好的參考),除了20.5.5.15,我在標准中找不到合適的參考:
C ++標准庫中定義的類型的對象可以從(15.8)中移出。 移動操作可以顯式指定或隱式生成。 除非另有說明,否則此類移出的對象應置於有效但未指定的狀態。
是否對先前包含在目標容器中的元素有任何要求,例如在分配之前被銷毀?
例:
std::list<SomeClass> v1({10, 12});
std::list<SomeClass> v2({7});
v1 = std::move(v2);
for(auto sc : v2)
{
std::cout << sc << ' ';
}
雖然GCC根本不輸出任何東西( std::vector
和std::list
都一樣),但將收到10 12
作為合法的輸出(提供了適當的operator<<
提供)(例如,通過交換內容(特別是不刪除對象)來接收以前包含)?
到現在為止,我會說“是”,但對於要依靠它的把握還不夠確定,並且好奇不提出問題...
如果合法,如果元素沒有立即被銷毀(例如,結果某些資源仍處於打開狀態,而開發人員期望它們被關閉),那么對於任何開發人員來說,這是否會出乎意料?
在[container.requirements.general]
,我們看到了
現有的所有元素
a
或者是移動分配或銷毀。 確保 :a
等於rv
在此分配之前的值。
其中a
是目的地, rv
是右值。 這可以通過將1與源目標的元素交換來實現,但是很可能是通過調整大小然后移動來完成的。
__swap
來確保確實發生了移動分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.