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.
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.
Tags und Links c++ multithreading stdthread