仅移动类型的 back_inserter

Posted

技术标签:

【中文标题】仅移动类型的 back_inserter【英文标题】:back_inserter for move-only type 【发布时间】: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 不可移动。 【参考方案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 通过引用捕获,构造函数通过引用接受 - 但是它会制作一个副本以传递给新生成的线程。 这就是为什么通过检查函数声明来合理化代码是不够的。必须阅读文档

以上是关于仅移动类型的 back_inserter的主要内容,如果未能解决你的问题,请参考以下文章

STL之--插入迭代器(back_inserter,inserter,front_inserter的区别)

在 c++11 模式下使用带有仅移动参数的 QtConcurrent::run

是否可以仅将 Facebook 移动 SDK 用于移动应用安装广告?

尝试通过仅移动内容的批处理脚本移动文件夹

在移动设备上实现“更少”时仅触摸一次移动火力

Phonegap 仅用于移动开发