[英]std::make_unique's (and emplace, emplace_back's) awkward deduction for initializer_list arguments
[英]push_back or emplace_back with std::make_unique
基于在回答这些 问题 在这里 ,我知道这肯定是最好使用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:< - (微笑)
就新物体的构造而言,它没有任何区别; 你已经有了一个unique_ptr<Foo>
prvalue(调用make_unique
的结果)所以push_back
和emplace_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.