c – std :: thread并在visual studio 2013中移动

我有一个只有可移动的类和一个函数,它通过值获取此类的对象.

函数在新线程中调用:

void foo(MyClass a) {}

int main()
{
   MyClass a;
   std::thread t(&foo, std::move(a));
}

我得到一个编译器错误,因为MyClass缺少了复制构造函数(我删除了他),如果我实现了他,则会调用copy-constructor.

显然这是一个bug,它在gcc中没有copy-constructor编译.
有没有解决方法?

最佳答案 如果该方法需要a的所有权,请将其传递给堆,最好是在shared_ptr中:

void foo(std::shared_ptr<MyClass> a) {}
 [...]

auto a_ptr = std::make_shared<MyClass>();
std::thread t(foo, a_ptr);

否则只需通过引用传递:

void foo(MyClass& a) {}
 [...]

MyClass a;
std::thread(foo, std::ref(a));
点赞