0

例えば:

std::vector<std::pair<std::string, bool > > v;
std::pair<std::string, bool> pr;
v.push_back( pr );

std::pair移動代入演算子が定義されていると仮定します。v.push_back の呼び出しは自動的に移動割り当てを使用しますか、それとも具体的にそのように要求する必要がありますか?

v.push_back( std::move(pr) );
4

1 に答える 1

1

関数の引数(この場合はの引数push_back)が右辺値である場合、および関数からオブジェクトを返す特定の状況でのみ、移動が行われます。

あなたの例では、prは右辺値ではないので、動かされません。

ただし、たとえば、次のように一時オブジェクトをベクターに渡す場合は、次のようになります。

v.push_back(std::pair<std::string,bool>());

これは右辺値になり、移動をトリガーします。

提案した方法で引数を右辺値に明示的にキャストすることで、移動をトリガーすることもできます。

v.push_back(std::move(pr));

ただし、この場合pr、内容が移動されているため、呼び出し後に意味のある方法で使用できなくなることに注意してください。

(もちろん、移動のもう1つの前提条件は、呼び出す関数が実際に右辺値参照を受け入れることです。ベクトルpush_backの場合、これは確かに当てはまります。)

于 2012-11-16T03:15:03.330 に答える