使用std :: make_unique的push_back或emplace_back

时间:2015-03-17 00:16:11

标签: c++ c++11 stdvector c++14 unique-ptr

根据these questions here中的答案,我知道使用c ++ 14 std::make_unique而不是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_back时,我应该使用std::unique_ptr还是std::make_unique

====编辑====

为什么? c:&lt; - (微笑)

2 个答案:

答案 0 :(得分:12)

就新对象的构造而言,它没有任何区别;您已经拥有unique_ptr<Foo> prvalue(调用make_unique的结果),因此push_backemplace_back在构造元素时都会调用unique_ptr移动构造函数要附加到vector

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

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

答案 1 :(得分:0)

显然

template<class T, class A, class...Args>
void push_unique( std::vector<std::unique_ptr<T>,A>& v, Args&&...args ) {
  v.push_back( std::make_unique<T>(std::forward<Args>(args)...) );
}

是最佳选择:

push_unique(my_vector,"constructor", "args");

遗憾的是这是前缀表示法:(运算符,容器,参数...)vs infix(容器运算符参数......)。

如果只有一种方法可以使其成为中缀,例如extension methodsnamed operators

因为那会很酷。