2015-11-23 18 views
8

Also versuche ich, einen std :: unique Zeiger als Parameter an eine Funktion übergeben, die in einem separaten Thread gestartet wird, und ich bekomme einen seltsamen Fehler zum Zeitpunkt der Kompilierung, die lautet:std :: unique_ptr als Parameter in 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 

Eine vereinfachte Version dieses Codes, die immer noch das gleiche Problem reproduziert wird:

#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; 
} 

Meine Vermutung ist, dass es etwas falsch mit der Zerstörung des Widget-Objekts ist von main(), aber ich kann das Problem nicht lokalisieren. Ist es notwendig, etwas zu tun, um diese Variable zu bereinigen? Übrigens verwende ich VS2013.

+1

@DevSolar nicht 'std :: thread' immer eine xValue seiner Handler übergeben, und dies ist eine MSVC Fehlfunktion? –

+2

GCC akzeptiert es. 'std :: thread t ([& widget]() {processWidget (std :: move (widget));});' Funktioniert auch. –

+1

funktioniert gut in Orwel DevC++ 5.11 bro !! nichts scheint falsch mit Ihrem Code –

Antwort

-1

Sie dürfen keine Kopie von unique_ptr erstellen, daher ist der Kopierkonstruktor deaktiviert. Das zeigt den Compilerfehler an.

Sie können das Problem beheben mit einer Referenz:

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

niemand macht eine Kopie im OP-Code –

+0

@PiotrSkotnicki Nicht direkt, aber der Konstruktor für ['std :: thread'] (http://en.cppreference.com/w/cpp/thread/thread/thread) Kopien/verschiebt seine Argumente, um einen Accessible-Speicher einzufädeln, und dann wird dieser beim Aufruf der Funktion selbst kopiert. – sjdowling

+0

@sjdowling können Sie bitte eine Standardreferenz angeben, die besagt, dass 'std :: thread' eine Kopie erstellt, um den Handler aufzurufen? –

Verwandte Themen