push_back or emplace_back with std::make_unique

NHDaly picture NHDaly · Mar 17, 2015 · Viewed 9k times · Source

Based on the answers in these questions here, I know that it is certainly preferred to use c++14's std::make_unique than to emplace_back(new X) directly.

That said, is it preferred to call

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

or

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

That is, should I use push_back or emplace_back when adding an std::unique_ptr constructed from std::make_unique?

==== EDIT ====

and why? c: <-- (tiny smile)

Answer

Praetorian picture Praetorian · Mar 17, 2015

It doesn't make a difference as far as construction of the new object is concerned; you already have a unique_ptr<Foo> prvalue (the result of the call to make_unique) so both push_back and emplace_back will call the unique_ptr move constructor when constructing the element to be appended to the vector.

If your use case involves accessing the newly constructed element after insertion, then emplace_back is more convenient since C++17 because it returns a reference to the element. So instead of

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

you can write

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