式var1
は左辺値です。適用するstd::move(var1)
と、同じオブジェクトを参照する右辺値が得られます。int&&
次に、この右辺値を呼び出された にバインドしvar
ます。
式var
も左辺値です。これは、名前付き変数である式は左辺値であるためです (その型が右辺値参照であっても)。次にvar2
、 の値で初期化しますvar
。
var1
つまり、値を からにコピーしただけですvar2
。何も動かされていません。実際、 のような基本型から移動することさえできませんint
。一時的なものから初期化または割り当てを試みると、int
その値がコピーされるだけで、何も移動されません。
移動コンストラクターと代入演算子を持つ型を使用しT
ていたとしても、コードは何も移動しません。これは、参照以外の初期化を行うのは lineint var2(var);
だけだからですが、ここvar
には左辺値があります。つまり、代わりにコピー コンストラクターが使用されます。
var1
からに移動する最も簡単な方法は、次のvar2
ようにすることです。
void func(T var)
{
T var2(move(var));
}
void main()
{
T var1(22);
func(move(var1));
}
これは から create に移動しvar1
、var
次に から create に移動var
しますvar2
。
右辺値参照に戻すことを除いて、ほぼ同じ方法でこれを行うことができvar
ますが、お勧めしません。渡される右辺値が内部移動によって無効になることを文書化する必要があります。