初期化子リストは式ではないため、型を持たず、値を生成しません。これは、次のことを意味します。
{std::move(key),std::move(value)}
それ自体はペアを作成しません。初期化子リストは、初期化に使用される単なる構文構造であり、この場合、関数パラメーターはwithおよびas 引数のコンストラクターを直接呼び出すことによって構築されます。pairtype
std::move(key)
std::move(value)
関連する一時オブジェクトの作成はありません。注意すべき唯一のことは、explicit
リストの初期化を実行するときにコンストラクターが考慮されないことです (たとえば、これは のインスタンスでは機能しませんstd::tuple<>
)。
foo
これは、先ほど説明した の呼び出し、つまり次のことを意味します。
foo({std::move(key),std::move(value)}
この呼び出しとは技術的に異なります。
foo(std::move(pairtype(std::move(key),std::move(value)))
ここでは、一時的なものを意図的に作成し、それを関数パラメーターに移動しています (コンパイラは 12.8/31 ごとにこの移動を除外する場合がありますが、これは別の話です)。
std::move()
一時変数は右辺値であるため、ここへの呼び出しは不要であることに注意してください。とにかく、関数パラメーターは一時オブジェクトからムーブ構築されます。したがって、次のように書くことができます。
foo(pairtype(std::move(key),std::move(value)))
pairtype
これはクラス テンプレートのインスタンスになることに注意してください。つまりstd::pair<>
、テンプレート引数を手動で指定する必要があります。これを回避するには、次を使用できますstd::make_pair()
。
foo(std::make_pair(std::move(key),std::move(value)))