Fehler: Verwendung der gelöschten Funktion 'std :: thread :: thread (const std :: thread &)'

8

Der folgende Code kompiliert und funktioniert wie erwartet. Die Struktur (Klasse) A stammt von std::thread und wird mit int more erweitert. Der Code main erstellt einige Threads und wartet anschließend darauf, dass sie fertig sind.

Das Problem ist, dass, während der Code ohne Destruktor in der Struktur A kompiliert wird, wenn der Destruktor unkommentiert ( ~A(){} ) ist:

  

Fehler: Verwendung der gelöschten Funktion 'std :: thread :: thread (const std :: thread & amp;)'

und ich habe keine Ahnung warum.

Außerdem verstehe ich nicht, warum der Code sowohl mit push_back als auch mit emplace_back funktioniert, während er nach meinem Verständnis nicht mit push_back funktionieren sollte.

%Vor%     
user3723779 14.12.2014, 20:37
quelle

1 Antwort

9

Wenn Sie den Destruktor haben möchten, können Sie Ihren Code durch Hinzufügen von

reparieren %Vor%

um den impliziten move ctor wiederherzustellen.

Ihr erstes Problem besteht darin, dass das Hinzufügen des benutzerdefinierten Destruktors die implizite Generierung des move -Konstruktors deaktiviert.

Der (irreführende) Fehler, den Sie sehen, ist, dass die STL versucht, auf Kopierarten zurückzugreifen, die nicht verschoben werden können, und fehlschlägt, weil std::thread absichtlich nicht kopierbar ist.

Siehe Seite cppreference des Implicitly-deklarierten Move-Konstruktors, und dies andere Frage für eine verwandte Motivation.

Die zweite Quelle der Verwirrung ist, dass push_back eine Überladung hat, so dass Ihr ursprünglicher Code niemals kopiert wurde und nur verschoben wurde. Wenn Sie das beweisen wollen, kommentieren Sie das dtor wieder, damit es wieder funktioniert, und versuchen Sie dann, push_back const auf einen A zu verweisen. Es wird sich über den Kopierkonstruktor beschweren, was bedeutet, dass die anderen Aufrufe von push_back dies nicht verwenden.

    
Useless 14.12.2014, 21:03
quelle

Tags und Links