2017-02-17 5 views
0

std::vector<T>::push_back()には移動セマンティクスのサポートがあります。したがって、名前付きの一時インスタンスをベクトルに追加すると、std::move()を使用できます。セマンティクスを移動する最も一般的な場所はC++ 11 STLで使用されていますか?

は、私はstd::vector<T>::push_back()はセマンティクスのサポートを動かす持っていることを知っている私はstd::move()

+0

「名前付き仮の」? 'emplace_back(some_type {..})'は(最適化の後で)正しいことをします。 – knivil

答えて

2

を追加する習慣を育てなければならないSTLの他の一般的な場所でどのようなものです。

push_backが有する支持体は、単にベクトル内の新しい値TT(T&&)代わりにT(const T&)を呼び出すことによって構築することができるように、右辺値参照をとり、追加の過負荷です。利点は、渡されたの値の参照がその後決して使用されないと仮定しているため、前者を効率的に実装できることです。

ほとんどの標準ライブラリコンテナは、プッシュ/エンキュー/挿入メンバー関数に類似のオーバーロードを追加しました。さらに、設置場所のコンセプトが、(例えば、std::vector<T>::emplace_backと追加されました。この値は、不必要な一時的な時間を避けるためにコンテナ内の場所に構築されています。挿入は、挿入/押し込みより優先されるべきである。


私はベクトルに名前の一時的なインスタンスを追加するときに、私はstd::move()を使用することができます。

「名前付きテンポラリ」は本当に意味をなさない。あなたはの左辺値をもう気にせず、std::moveを使用して一時的に変換したいと考えています。例:それは文字通りstatic_cast<T&&>を意味します

Foo foo; 
some_vector.emplace_back(std::move(foo)); 
// I'm sure `foo` won't be used from now on 

だけstd::moveが特別ではないことを覚えておいてください。


私はstd::moveを追加する習慣を育てなければならないSTLの他の一般的な場所は何ですか?

これは本当に広い質問です。std::moveを追加する必要があります。これは、標準ライブラリのコンテキストだけでなく、意味を成しています。 の左辺値がある場合は、特定のコードパスでこれ以上使用するつもりはなく、別の場所に渡したい場合はstd::moveです。

関連する問題