【问题标题】:back_inserter for move-only type仅移动类型的 back_inserter
【发布时间】:2013-08-09 17:58:03
【问题描述】:

在以下代码中,对象“队列”是不可复制的,但由于 std::mutex 是可移动的。

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

VC++2012 由于互斥体上的私有复制构造函数而无法编译。无法为队列生成复制构造函数。为什么会有任何东西试图复制队列?在我看来,一切都是参考,因此没有副本。

【问题讨论】:

  • 旁注:std::mutex 不可移动。

标签: c++ c++11


【解决方案1】:

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

如果你真的想将queue 移动到std::thread 中,你需要传递std::move(queue) 使其成为右值。不过还是不行,because of a bug in VS

【讨论】:

  • std::ref 如何解决问题? std::thread 的构造函数是 template explicit thread( Function&& f, Args&&... args ),它应该折叠为通过引用获取它,因为 lambda 通过引用捕获它,对吗?
  • @Graznarak 构造函数大致指定为调用第一个参数,并将其他参数的副本作为参数(30.3.1.2/4)。实际上,您必须以某种方式复制新线程的所有参数,因为本地堆栈将发生变化。所以是的 - lambda 通过引用捕获,构造函数通过引用接受 - 但是它会制作一个副本以传递给新生成的线程。
  • 这就是为什么通过检查函数声明来合理化代码是不够的。必须阅读文档
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2019-04-01
  • 2011-02-10
  • 2017-12-15
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多