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_back
和 emplace_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。
因为那会很酷。
根据 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_back
和 emplace_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。
因为那会很酷。