如果一個對象實際移動到另一個位置,原始對象上支持的操作是什麼?對象移動後支持什麼操作?
爲了闡述它,我有一個T
類型的可用移動構造函數。用下面的語句
T x{constructor-args};
T y{std::move(x)};
什麼都可以與對象x
來完成(前提是該對象實際上是從x
使用T
可移動構造函數移至y
)?
具體來說,
x
可以被毀滅,是肯定的。移動後,我可以假設x
是輕微破壞嗎?- 可以
x
被分配或移動分配給一個新的對象(我猜是的,因爲我看到很多swap
使用這個)? 我可以構造一個新的對象對象來代替
x
?如果有機會這是允許的,那麼是否有可能有一個uninitialized_move
與(部分)重疊的源&目標範圍一起使用,如std::copy
而不像std::uninitialized_copy
?T z{some-args}; x = z; //or x = std::move(z); T u{some-args}; new(&x) T{std::move(u)}; // or new(&x) T{u}; etc
這意味着更多。例如,對於'std :: vector',一個有效但未指定的狀態意味着如果'v'已經被移動了,你仍然可以爲(size_t i = 0; i!= v)調用'v.size()'。 size(); ++ i)v [i];'必須仍然有效,'v.push_back(something);'必須工作。在實踐中,如果你支持銷燬,支持'std :: vector'則不會有太多的工作,但對於更復雜的類型,它可能會有所作爲。 –
你說得對,但我正在談論一個明智的移動操作符的*最普遍*的要求。 – spraff
是的。這正是我的觀點。最普通的要求比標準要求的要低。 –