2015-11-23 24 views
8

Quindi sto provando a passare un puntatore std :: unique come parametro a una funzione che viene avviata in un thread separato, e sto ricevendo uno strano errore in fase di compilazione che legge:std :: unique_ptr come parametro per funzionare 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 

Una versione semplificata di questo codice, che riproduce ancora lo stesso problema è:

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

la mia ipotesi è che ci sia qualcosa di sbagliato con la distruzione dell'oggetto widget da main(), tuttavia non riesco a individuare il problema. È necessario fare qualcosa in più per ripulire quella variabile? A proposito, sto usando VS2013.

+1

@DevSolar non 'std :: thread' passa sempre un xValue al suo gestore, e questo è un malfunzionamento MSVC? –

+2

GCC lo accetta. 'std :: thread t ([& widget]() {processWidget (std :: move (widget));});' Funziona anche. –

+1

funziona bene in Orwel DevC++ 5.11 bro !! niente sembra sbagliato con il tuo codice –

risposta

-1

Non è consentito eseguire la copia di unique_ptr, pertanto il costruttore di copie è disabilitato. Ciò sta indicando l'errore del compilatore.

È possibile risolvere il problema con un riferimento:

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

nessuno sta facendo una copia nel codice OP –

+0

@PiotrSkotnicki Non direttamente ma il costruttore per ['std :: thread'] (http://en.cppreference.com/w/cpp/thread/thread/thread) copie/sposta i suoi argomenti per eseguire il thread dell'accessibilità e quindi viene copiato quando chiama la funzione stessa. – sjdowling

+0

@sjdowling puoi fornire un riferimento standard che dice che 'std :: thread' fa una copia per chiamare il suo gestore? –

Problemi correlati