所以我試圖將一個std :: unique指針作爲參數傳遞給在單獨的線程中啓動的函數,並且出現了一個奇怪的錯誤在編譯的時候,上面寫着:std :: unique_ptr作爲std :: thread函數的參數
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional(1149): error C2280: 'std::unique_ptr<Widget,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
這個代碼,仍然再現了同樣的問題的簡化版本是:
#include <thread>
#include <memory>
#include <iostream>
class Widget
{
public:
Widget() : m_data(0)
{
}
void prepareData(int i)
{
m_data = i;
}
int getData() const
{
return m_data;
}
private:
int m_data;
};
void processWidget(std::unique_ptr<Widget> widget)
{
std::cout << widget->getData() << std::endl;
}
int main()
{
std::unique_ptr<Widget> widget(new Widget());
widget->prepareData(42);
std::thread t(processWidget, std::move(widget));
t.join();
return 0;
}
我的猜測是,有一些錯誤的Widget對象的破壞從主要(),但我不能指出的問題。是否有必要額外做些清理該變量的事情?順便說一句,我使用VS2013。
@DevSolar不'的std :: thread'總是傳遞的x值它的處理程序,這是一個MSVC故障呢? –
GCC接受它。 'std :: thread t([&widget](){processWidget(std :: move(widget));});'也適用。 –
在Orwel DevC++ 5.11 bro中運行良好!你的代碼沒有什麼問題 –