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)
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();