调用默认矢量构造函数的正确方法是什么,以创建' n' std::unique_ptr
持有线程的元素。
std::vector<std::unique_ptr<std::thread>> thr_grp(5, std::move(std::make_unique<std::thread>(std::thread(), threadWorker)));
或
std::vector<std::unique_ptr<std::thread>> thr_grp(5, std::move(std::unique_ptr<std::thread>(new std::thread(threadWorker))));
或者没有std::move
语义?
答案 0 :(得分:6)
这不能以这种方式完成,因为std::vector
的填充constructors使指定参数的副本和std::unique_ptr
删除了复制构造函数。
您可以将emplace个元素转换为默认构造的std::vector<std::unique_ptr<std::thread>>
,如下例所示:
#include <iostream>
#include <memory>
#include <thread>
#include <vector>
void threadWorker() {
std::cout << "I'm thread: " << std::this_thread::get_id() << std::endl;
}
int main() {
std::vector<std::unique_ptr<std::thread>> thr_grp;
for(int i = 0; i < 5; ++i)
thr_grp.emplace_back(std::make_unique<std::thread>(threadWorker));
for(auto& e : thr_grp)
e->join();
return 0;
}
另一种方法是使用默认构造值构造和填充std::vector
并稍后分配值:
std::vector<std::unique_ptr<std::thread>> thr_grp(5);
for(auto& e : thr_grp)
e = std::make_unique<std::thread>(threadWorker);
上面的代码将使用移动语义,您不必使用std::move
明确指出它。