根据答案 这些 问题 这里,我知道使用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
会打电话给 unique_ptr
构造要附加到的元素时移动构造函数 vector
。
如果您的用例涉及在插入后访问新构造的元素,那么 emplace_back
从C ++ 17开始更方便,因为它返回对元素的引用。而不是
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(容器运算符参数...)。
如果只有一种方法可以使其成为中缀,就像 扩展方法 要么 命名运营商。
因为那会很酷。