2012-08-25 25 views
1

可能重複:
What constitutes a valid state for a 「moved from」 object in C++11?究竟是什麼需要的已移動的xvalue?

考慮這樣的事情:

class Foo {}; 
std::vector<Foo> v(5); 

是否合法做這樣的事情:

v.front() = std::move(v.back()); 

前提是我不喜歡這樣算賬:

v.pop_back(); 

更確切地說我想知道什麼是必需的經歷std::move()語義的x值。
我知道它需要被破壞(顯然)。但是別的嗎?假設我會打電話std::vector::insert()或其他一些功能,可能會在幕後複製/移動編輯值。
那還合法嗎?

在我的真實情況下,我有std::vector<std::vector<Foo>>並做了什麼。
但我不知道是否合法std::move()std::vector仍然由外部std::vector使用。

+0

感謝您的參考 – iolo

回答

2

是的,這是有效的:你總是可以銷燬一個移動的對象。 (我無法找到C++語言標準中指定的位置 - 或者是否 - 這是指定的,但如果移除對象不能被銷燬,我相信我們都會考慮這個錯誤)。破壞移動的對象,你的代碼很好。

標準庫對移動源對象的狀態以及標準庫組件實例化的任何類型都必須遵守這些附加規則。要點是移動和複製操作對於非移動類型的對象有效,對於移動類型的對象也必須是有效的。因此,例如,在移動最後一個元素後,可以爲該元素分配一個新值:v.back() = Foo();

+0

好的!謝謝:)雖然我很樂意在標準的深處發現我相信你的地方。這是常識應該告訴的;) – iolo

+1

@iolo,見17.3.26 [defns.valid]和17.6.5.15 [lib.types.movedfrom] –