移动std::thread

12

试图让简单的代码工作:

std::thread threadFoo;

std::thread&& threadBar = std::thread(threadFunction);

threadFoo = threadBar; // thread& operator=( thread&& other ); expected to be called

出现错误:

使用已删除的函数“std::thread&std :: thread :: operator =(const std :: thread&)”

我明确将 threadBar 定义为右值引用,而不是普通引用。为什么会调用不该被调用的运算符?如何将一个线程移动到另一个线程?

谢谢!

2个回答

16

命名引用是左值。左值不能绑定到右值引用。您需要使用std::move

threadFoo = std::move(threadBar);

非常感谢您的回答。我理解得对吗,预期的操作符只能通过临时线程对象来使用,例如 threadFoo = std::thread(threadFunction); - Kolyunya
3
std::move 获得的是一个临时对象或者未命名的引用。 - R. Martinho Fernandes

1
请参阅std::thread::swap。这可以实现为:
std::thread threadFoo;
std::thread threadBar = std::thread(threadFunction);
threadBar.swap(threadFoo);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接