繁体   English   中英

使用std :: make_unique的push_back或emplace_back

[英]push_back or emplace_back with std::make_unique

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

那就是说,打电话是首选

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

要么

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

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

====编辑====

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

就新物体的构造而言,它没有任何区别; 你已经有了一个unique_ptr<Foo> prvalue(调用make_unique的结果)所以push_backemplace_back都会在构造要附加到vector的元素时调用unique_ptr move构造函数。

如果你的用例涉及在插入后访问新构造的元素,那么从C ++ 17开始, 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();

明确地

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(容器运算符参数...)。

如果只有一种方法可以使其成为中缀,例如扩展方法命名运算符

因为那会很酷。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM