式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ますが、お勧めしません。渡される右辺値が内部移動によって無効になることを文書化する必要があります。