右辺値参照型と左辺値参照型は,
- 異なった型として扱われるのと,
- 関数の戻り値型 (とキャストの型) に指定された場合に,その関数の呼び出し結果が右辺値として扱われるか左辺値として扱われるかが異なるのと,
- 参照への参照をただの参照に変換する規則 (reference collapsing rule) において振る舞いが異なるのと,
- 初期化の semantics が違うのと,
- 関数のパラメタ型に指定されている場合のオーバーロード解決の規則が異なるのと,
- 関数テンプレートのパラメタ型として指定された場合に,型パラメタの推論の仕方が異なる
のを除いて従来からの参照と振る舞いが全く一緒. (で,左辺値参照が従来からの参照に対応してる)
特に,一度でも名前がついたオブジェクトは明示的に変換をかけない限り常に左辺値として扱われる.この点に関しては,そのオブジェクトへの参照の型が右辺値参照型か左辺値参照型かはまったく関係ない.
void f(int &i) { i; // 式 i の結果は左辺値として扱われる }
void f(int &&i) { i; // 式 i の結果は左辺値として扱われる }
重要なのは,ある参照が右辺値参照型か左辺値参照型かではなくて,ある式が右辺値なのか左辺値なのか.
……ということを誰かもっとわかりやすい説明に書き換えてくだしあっ!!!