使用std :: make_unique的push_back或emplace_back

NHD*_*aly 17 c++ stdvector unique-ptr c++11 c++14

基于在回答这些 问题 在这里,我知道这肯定是最好使用C++ 14的std::make_unique,而不是emplace_back(new X)直接.

那就是说,打电话是首选

my_vector.push_back(std::make_unique<Foo>("constructor", "args"));
Run Code Online (Sandbox Code Playgroud)

要么

my_vector.emplace_back(std::make_unique<Foo>("constructor", "args"));
Run Code Online (Sandbox Code Playgroud)

也就是说,我应该使用push_backemplace_back何时添加std::unique_ptr构造的std::make_unique

====编辑====

为什么?c:< - (微笑)

Pra*_*ian 14

就新物体的构造而言,它没有任何区别; 你已经有了一个unique_ptr<Foo>prvalue(调用的结果make_unique),所以两者push_backemplace_back会调用unique_ptr构造被附加到的元素时移动的构造vector.

如果你的用例涉及在插入后访问新构造的元素,那么emplace_back从C++ 17起更方便,因为它返回对元素的引用.而不是

my_vector.push_back(std::make_unique<Foo>("constructor", "args"));
my_vector.back().do_stuff();
Run Code Online (Sandbox Code Playgroud)

你可以写

my_vector.emplace_back(std::make_unique<Foo>("constructor", "args")).do_stuff();
Run Code Online (Sandbox Code Playgroud)

  • 实际上,是有区别的......`emplace_back()`返回对添加元素的引用,而`push_back()`返回void。因此,“emplace_back(std::make_unique&lt;&gt;())”在添加对象后需要使用该对象的上下文中非常有用。 (3认同)
  • @JamieBullock 好吧,我 3 年前回答这个问题时没有区别。更新了答案以包含对返回类型的 C++17 更改。谢谢。 (2认同)