std::make_unique を使用した push_back または emplace_back 質問する

std::make_unique を使用した push_back または emplace_back 質問する

の回答に基づいてこれら 質問 ここstd::make_unique直接使用するよりも、C++14 を使用する方が確実に好ましいことはわかっていますemplace_back(new X)

とはいえ、電話するほうが好ましいでしょうか

my_vector.push_back(std::make_unique<Foo>("constructor", "args"));

または

my_vector.emplace_back(std::make_unique<Foo>("constructor", "args"));

つまり、から構築された を追加する場合、push_backと のどちらを使用すればよいのでしょうか?emplace_backstd::unique_ptrstd::make_unique

==== 編集 ====

そしてなぜ? c: <-- (小さな笑顔)

ベストアンサー1

新しいオブジェクトの構築に関しては違いはありません。すでにunique_ptr<Foo>prvalue ( の呼び出しの結果make_unique) があるため、に追加される要素を構築するときにpush_backと の両方が移動コンストラクターemplace_backを呼び出します。unique_ptrvector

挿入後に新しく構築された要素にアクセスするユースケースの場合、emplace_backC++17以降は要素への参照を返すため、より便利です。

my_vector.push_back(std::make_unique<Foo>("constructor", "args"));
my_vector.back().do_stuff();

あなたは書ける

my_vector.emplace_back(std::make_unique<Foo>("constructor", "args")).do_stuff();

おすすめ記事