up:: Cpp
source:: 右辺値参照・ムーブセマンティクス - cpprefjp C++日本語リファレンス
特殊右辺値参照。関数テンプレートの型パラメータT
や型推論プレースホルダauto
に&&を付けた場合。
与えられた数値が左辺値ならば左辺値参照、右辺値ならば右辺値参照になる。
しかしどちらかに定まった後、関数内で別関数にその値を使おうとすると厄介なことになる。
ダブルアンパサンドで書いたように、右辺値参照はそのまま入れると左辺値扱いになり、関数によっては使えない。再び右辺値に変換する必要がある。
そのための関数がstd::forward()
。std::forward<T>(a)
のように型パラメータと一緒に渡すことで、別関数が左辺値参照なら左辺値、右辺値参照なら右辺値に変換して渡すことが出来る。
別名は完全転送。
#include <utility>
template <typename T> void g(T);
template <typename T>
void f(T&& a)
{
// 引数 a が左辺値参照の場合は 左辺値 に
// 右辺値参照の場合は 右辺値 に変換してから
// 別関数 g() の実引数として渡す。
g( std::forward<T>(a) ) ;
// 関数 g() は値型 T としてパラメータを取るため
// 左辺値ではコピーが、右辺値ではムーブが行われる。
}
ちなみに完全じゃない転送はこちら。
ムーブセマンティクス