根据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; - (微笑)
答案 0 :(得分:12)
就新对象的构造而言,它没有任何区别;您已经拥有unique_ptr<Foo>
prvalue(调用make_unique
的结果),因此push_back
和emplace_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 methods或named operators。
因为那会很酷。