Heim > Backend-Entwicklung > C++ > Hauptteil

Warum ruft die Übergabe eines Objekts per Referenz an std::thread den Kopierkonstruktor auf?

Linda Hamilton
Freigeben: 2024-11-15 08:17:02
Original
323 Leute haben es durchsucht

Why Does Passing an Object by Reference to std::thread Invoke the Copy Constructor?

std::thread: Pass by Reference ruft den Kopierkonstruktor auf

Verstehen des Problems

Bei der Übergabe von Objekten an std::thread werden normalerweise Argumente verwendet in den Thread kopiert, anstatt referenziert zu werden. Dieses Verhalten widerspricht der Erwartung, dass durch die Referenzübergabe eine Kopierkonstruktion vermieden werden sollte. Die Verwirrung ergibt sich aus der Unterscheidung zwischen Referenzen und Zeigern in C.

Konstruktor kopieren und per Referenz übergeben

In C bedeutet die Übergabe eines Objekts per Referenz im Allgemeinen die Übergabe seiner Adresse, was der Übergabe gleichkommt ein Zeiger. Allerdings verfügt std::thread über eine spezifische Implementierung, die erfordert, dass seine Argumente nach Wert kopiert werden.

Verwendung von std::reference_wrapper

Um Referenzsemantik zu erreichen, verwenden Sie std::reference_wrapper wie folgt:

std::thread newThread(session, &sock, std::ref(logger));
Nach dem Login kopieren

Auf diese Weise wird der Logger nicht kopiert, sondern seine Referenz wird an den Thread übergeben. Beachten Sie, dass der Logger den Thread überleben muss.

Semantik beim Verschieben

Die Verwendung von std::move() wird in diesem Fall nicht empfohlen, da std::thread erwartet, dass Argumente kopiert werden. Durch das Verschieben des Objekts würde der Besitz seines Speichers auf den Thread übertragen, was möglicherweise unerwünscht ist.

Wenn Ihr Code zuvor mit std::move() funktionierte, jetzt aber fehlschlägt, ist es möglich, dass Ihre Version des Compilers implementiert C 11 nicht vollständig. Erwägen Sie, Ihren Compiler für eine verbesserte C 11-Unterstützung zu aktualisieren.

Das obige ist der detaillierte Inhalt vonWarum ruft die Übergabe eines Objekts per Referenz an std::thread den Kopierkonstruktor auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage