Heim  >  Artikel  >  Backend-Entwicklung  >  Warum umgeht „std::thread' Kopierkonstruktoren nicht, wenn Argumente per Referenz übergeben werden?

Warum umgeht „std::thread' Kopierkonstruktoren nicht, wenn Argumente per Referenz übergeben werden?

DDD
DDDOriginal
2024-11-27 12:04:09925Durchsuche

Why Does `std::thread` Not Bypass Copy Constructors When Passing Arguments by Reference?

std::thread- und Kopierkonstruktoren: Das Pass-by-Reference-Rätsel verstehen

std::thread, ein integraler Bestandteil moderner C-Multithreading-Funktionen stellen ein Dilemma dar, wenn Objekte als Referenz übergeben werden. Dies liegt an einem grundlegenden Unterschied zwischen der Art und Weise, wie die Sprache mit Referenzen umgeht, und der Art und Weise, wie std::thread ihre Argumente verarbeitet.

Bei der Übergabe eines Objekts als Referenz erwarten wir, dass der Kopierkonstruktor umgangen wird, da die Referenz als solche fungiert ein Alias ​​für das Originalobjekt. Diese Annahme gilt jedoch nicht für std::thread. Hier ist der Grund.

Argumentverarbeitung von std::thread

Entgegen unseren Erwartungen übergibt std::thread seine Argumente nach Wert. Ein Funktionsobjekt wird deklariert, akzeptiert dieselben Parameter wie der Thread und wird dann mit den bereitgestellten Argumenten aufgerufen. Dies bedeutet, dass jedes Argument in das Funktionsobjekt kopiert wird, auch wenn es als Referenz übergeben wird.

Private Copy-Konstruktoren und fehlgeschlagene Kompilierung

Im bereitgestellten Code wird das Die Protokollklasse deaktiviert den Kopierkonstruktor absichtlich, indem sie ihn privat macht. Wenn std::thread versucht, den Logger in das Funktionsobjekt zu kopieren, wird ein Kompilierungsfehler ausgelöst, da auf den privaten Kopierkonstruktor nicht zugegriffen werden kann.

Beheben des Problems mit std::reference_wrapper

Um die Referenzsemantik bei der Übergabe von Argumenten an std::thread wiederherzustellen, können wir verwenden std::reference_wrapper. Durch das Umschließen der Referenz mit std::reference_wrapper wird sichergestellt, dass das Funktionsobjekt eine Referenz auf das Originalobjekt erhält, wodurch die Fallstricke des Wertkopierens vermieden werden.

Code mit std::reference_wrapper

std::thread newThread(session, &sock, std::ref(logger));

In diesem korrigierten Beispiel ist der Compiler in der Lage, das std::thread-Objekt korrekt zu erstellen, da der Logger jetzt eingebunden ist std::reference_wrapper, behält seinen Referenzstatus bei.

Das obige ist der detaillierte Inhalt vonWarum umgeht „std::thread' Kopierkonstruktoren nicht, wenn Argumente per Referenz übergeben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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