2017-06-20 5 views
3

std::unique_ptrの保持スレッドのn個の要素を作成するデフォルトベクトルコンストラクタを呼び出す正しい方法は何ですか?unique_ptrとスレッドを持つデフォルトのベクトルコンストラクタ

std::vector<std::unique_ptr<std::thread>> thr_grp(5, std::move(std::make_unique<std::thread>(std::thread(), threadWorker))); 

またはstd::moveセマンティックアウトと

std::vector<std::unique_ptr<std::thread>> thr_grp(5, std::move(std::unique_ptr<std::thread>(new std::thread(threadWorker)))); 

かのどちらか?

答えて

6

std::vectorconstructorsの塗りつぶしが指定されたパラメータのコピーを作成し、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と指定する必要はありません。

+1

私は通常、 – MikeMB

関連する問題