右辺値参照は、右辺値を束縛する参照である。
&
で宣言される参照型を左辺値参照と呼ぶのに対して、&&
で宣言される参照型を右辺値参照と呼ぶ。
C++11 以前では、右辺値参照と左辺値参照を区別しなかったため、右辺値はconst左辺値参照 (const&
) に束縛するよう扱われていた。
そのため、右辺値のみに対して特別な処理を記述することができなかった。
vector<int> v, vv;
v = vv; // 代入式1
v = vector<int>(100, 0); // 代入式2
上記コードは C++11 以前では、代入式1,2とも右辺の型は vector<int> const&
になる。
代入処理の中では、右辺の値をコピーし、左辺の値と置き換える処理が行われる。
しかし代入式2の右辺は一時オブジェクトであり、直後に破棄されるため、これをコピーすることは無駄な処理といえる。
右辺値と左辺値が型として区別できるのであれば、右辺値の場合はコピーせず単に左辺と置き換えるといった処理が記述できる。
右辺値参照は、右辺値と左辺値を型として区別するために導入された。
C++11 以降では、代入式2の右辺の型は右辺値参照 vector<int>&&
になり、左辺値参照とは区別して処理される。
また、こうした処理のことを「ムーブ」と呼ぶ。
素晴らしい説明ですので
採用してもよいですか?