Heim > Artikel > Backend-Entwicklung > Warum umgeht „std::thread' Kopierkonstruktoren nicht, wenn Argumente per Referenz übergeben werden?
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!