2015-11-23 319 views
8

所以我試圖將一個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。

+1

@DevSolar不'的std :: thread'總是傳遞的x值它的處理程序,這是一個MSVC故障呢? –

+2

GCC接受它。 'std :: thread t([&widget](){processWidget(std :: move(widget));});'也適用。 –

+1

在Orwel DevC++ 5.11 bro中運行良好!你的代碼沒有什麼問題 –

回答

-1

您不允許複製unique_ptr,因此複製構造函數被禁用。這是指出編譯器錯誤。

您可以參考修復:

void processWidget(std::unique_ptr<Widget>& widget) 
+3

noone正在OP的代碼中複製 –

+0

@PiotrSkotnicki不是直接的,而是['std :: thread'](http://en.cppreference.com/w/cpp/thread/thread/thread)的構造函數複製/將其參數移動到線程可訪問的存儲區,然後在調用函數本身時被複制。 – sjdowling

+0

@sjdowling可以請你提供一個標準的參考,它說'std :: thread'使副本可以調用它的處理函數嗎? –

相關問題