back_inserter for move-only type

Gra*_*rak 2 c++ c++11

在下面的代码中,对象'queue'是不可复制的,但由于std :: mutex而可以移动.

std::generate_n(std::back_inserter(thread_pool),
                std::thread::hardware_concurrency,
                [&](){return std::thread(handler(), exiting, queue);});
Run Code Online (Sandbox Code Playgroud)

由于互斥锁上的私有拷贝构造函数,VC++ 2012无法编译.它无法为队列生成复制构造函数.为什么要尝试复制队列?在我看来,一切都是通过参考,因此没有副本.

Cas*_*sey 6

试图queue通过将值传递给std::thread构造函数来进行复制.如果您要传递引用,请使用包装器:std::ref(queue).

如果你真的想要queue进入std::thread,你需要传递std::move(queue)使它成为一个右值.但由于VS中存在错误,它仍然无法正常工作.

  • @Graznarak构造函数大致指定为调用第一个参数,其他参数的副本作为参数(30.3.1.2/4).实际上,你必须以某种方式复制新线程的所有参数,因为本地堆栈将会发生变化.所以是的 - lambda通过引用捕获,构造函数通过引用接受 - 但随后它将副本传递给新生成的线程. (2认同)