Perché nel seguente codice di esempio, l'oggetto viene copiato due volte? Secondo il costruttore di documentazione della classe thread, copia tutti gli argomenti sull'archiviazione thread-locale, quindi abbiamo un motivo per la prima copia. Che dire del secondo?std :: thread Perché l'oggetto viene copiato due volte?
class A {
public:
A() {cout << "[C]" << endl;}
~A() {cout << "[~D]" << endl;}
A(A const& src) {cout << "[COPY]" << endl;}
A& operator=(A const& src) {cout << "[=}" << endl; return *this;}
void operator()() {cout << "#" << endl;}
};
void foo()
{
A a;
thread t{a};
t.join();
}
uscita dall'alto:
[C]
[COPY]
[COPY]
[~D]
#
[~D]
[~D]
Edit: Ebbene sì, dopo l'aggiunta di movimento costruttore:
A(A && src) {cout << "[MOVE]" << endl;}
L'output è simile a questo:
[C]
[COPY]
[MOVE]
[~D]
#
[~D]
[~D]
Solo una piccola correzione: gli argomenti non vengono copiati in ** archiviazione locale locale **, ma nello stack del nuovo thread. L'archiviazione locale del thread è un animale completamente diverso; una variabile locale del thread è, in sostanza, una variabile globale per thread, accessibile da qualsiasi funzione nel thread, con una copia distinta in ogni thread. –
In effetti, secondo '[COPY]' è '[MOVE]', ma non puoi vederlo perché non hai implementato alcun costruttore di move. – soon
Nel caso precedente, il secondo [COPIA] è una copia. Solo se fornisci un costruttore di mosse o lo dichiari esplicito con = default ottieni la mossa. – Klaus