我有一个只能移动的类和一个按值获取此类对象的函数。 函数在新线程中调用:
void foo(MyClass a) {}
int main()
{
MyClass a;
std::thread t(&foo, std::move(a));
}
我收到编译器错误,因为MyClass缺少复制构造函数(我删除了他),如果我实现了他,则会调用复制构造函数。
显然这是一个bug,它在gcc中没有copy-constructor编译。 有没有解决方法?
答案 0 :(得分:2)
如果该方法需要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));