Skip to content

Instantly share code, notes, and snippets.

@bolero-MURAKAMI
Last active May 11, 2016 06:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bolero-MURAKAMI/12ca531e09999b63779cd72d4f2687f3 to your computer and use it in GitHub Desktop.
Save bolero-MURAKAMI/12ca531e09999b63779cd72d4f2687f3 to your computer and use it in GitHub Desktop.

右辺値参照は、右辺値を束縛する参照である。
& で宣言される参照型を左辺値参照と呼ぶのに対して、&& で宣言される参照型を右辺値参照と呼ぶ。
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>&& になり、左辺値参照とは区別して処理される。
また、こうした処理のことを「ムーブ」と呼ぶ。

@loliGothicK
Copy link

素晴らしい説明ですので
採用してもよいですか?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment