up:: Cpp
source:: 6.4. ムーブセマンティクス - ゼロから学ぶ C++

メモリ領域節約のためのC++機能。
まずこの式を考える。

std::vector<int> x(1000000);
std::vector<int> y = x; // ディープコピー
 
// 以降 x は利用しない

この式ではyにxの持つ値std::vector<int>(1000000)が丸々コピーされているため、計算コストが高くつく。
これを防ぐためには、xの持つ値→yの持つ値 へと、値に付いた変数の名前だけを付けかえればいい。ポインタの出番。

std::vector<int>* x = new std::vector<int>(1000000);
std::vector<int>* y = x; // シャローコピー
x = nullptr;
 
// 以降 x は利用しない

std::vector<int>(1000000)を参照するポインタxを作成。
その後、ポインタだけをyに移した後、xを破棄している。
これで名前だけを差し替えることになり高速に。

ただ、ポインタはバグの温床でありあまり使いたくない。そもそもC++はポインタを使いたくなくて代わりに参照が出来たわけだし。
参照もこういう操作をサポートする、というのが理想。

というわけで出来たのがlvalueとrvalueの分類、そしてstd::move

std::vector<int> x(1000000);
std::vector<int> y = std::move(x); // std::move で x を右辺値にキャスト
 
// 以降、xは利用しない

std::moveの役割はlvalueをrvalueにキャストすること。
xそのものを右辺値、つまり値そのものにすることで、yへの変数付け替えを行う。