簡體   English   中英

在容器上移動分配:先前包含的對象的狀態

[英]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::vectorstd::list都一樣),但將收到10 12作為合法的輸出(提供了適當的operator<<提供)(例如,通過交換內容(特別是刪除對象)來接收以前包含)?

到現在為止,我會說“是”,但對於要依靠它的把握還不夠確定,並且好奇不提出問題...

如果合法,如果元素沒有立即被銷毀(例如,結果某些資源仍處於打開狀態,而開發人員期望它們被關閉),那么對於任何開發人員來說,這是否會出乎意料?

[container.requirements.general] ,我們看到了

現有的所有元素a或者是移動分配或銷毀。 確保a等於rv在此分配之前的值。

其中a是目的地, rv是右值。 可以通過將1與源目標的元素交換來實現,但是很可能是通過調整大小然后移動來完成的。

  1. 必須通過非專用__swap來確保確實發生了移動分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM