具有unique_ptr和线程的默认向量构造函数

The*_*ena 3 c++ multithreading unique-ptr c++14

调用默认向量构造函数的正确方法是什么,它可以创建std::unique_ptr持有线程的'n'元素.

std::vector<std::unique_ptr<std::thread>> thr_grp(5, std::move(std::make_unique<std::thread>(std::thread(), threadWorker)));
Run Code Online (Sandbox Code Playgroud)

要么

std::vector<std::unique_ptr<std::thread>> thr_grp(5, std::move(std::unique_ptr<std::thread>(new std::thread(threadWorker))));
Run Code Online (Sandbox Code Playgroud)

或者没有std::move语义?

Aki*_*ira 6

这不能以这种方式完成,因为make指定参数的make副本的构造std::vector函数和std::unique_ptr已删除的复制构造函数.

您可以元素置于默认构造中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;
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是构造和填充std::vector默认构造值,并在以后分配值:

std::vector<std::unique_ptr<std::thread>> thr_grp(5);
for(auto& e : thr_grp)
    e = std::make_unique<std::thread>(threadWorker);
Run Code Online (Sandbox Code Playgroud)

上面的代码将使用移动语义,您不必明确指出它std::move.