push_back 或 emplace_back 与 std::make_unique

push_back or emplace_back with std::make_unique

根据 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"));

也就是说,在添加由 std::make_unique 构造的 std::unique_ptr 时,我应该使用 push_back 还是 emplace_back

==== 编辑 ====

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

就新对象的构造而言,这没有什么区别;你已经有一个 unique_ptr<Foo> 纯右值(调用 make_unique 的结果)所以 push_backemplace_back 都会在构造元素时调用 unique_ptr 移动构造函数附加到 vector.

如果您的用例涉及在插入后访问新构造的元素,那么 emplace_back 自 C++17 以来更方便,因为它 returns 是对该元素的引用。所以而不是

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

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

要是有办法让它中缀就好了,比如extension methods or named operators

因为那会很酷。