Heim >Backend-Entwicklung >C++ >Wie soll ich in C eindeutige Zeiger als Funktionsparameter übergeben?
Eindeutige Zeiger als Funktionsparameter verwenden
Eindeutige Zeiger stellen Speicherverwaltungsfunktionen in C 11 bereit. Wenn ein unique_ptr als Funktionsargument übergeben wird, dort Es sind mehrere Ansätze zu berücksichtigen, von denen jeder unterschiedliche Auswirkungen hat.
Wertübergabe (Eigentum). Transfer)
Base(std::unique_ptr<Base> n) : next(std::move(n)) {}
Der Aufruf dieses Konstruktors erfordert die Übergabe des Zeigers als Wert, wodurch sein Besitz effektiv auf die Funktion übertragen wird:
Base newBase(std::move(nextBase));
Nach diesem Vorgang ist nextBase leer als Der Besitz des unique_ptr wurde übertragen.
Übergabe einer nicht konstanten L-Wert-Referenz (Besitz Mehrdeutigkeit)
Base(std::unique_ptr<Base> &n) : next(std::move(n)) {}
Dieser Ansatz erfordert einen tatsächlichen L-Wert (benannte Variable) als Argument:
Base newBase(nextBase);
In diesem Fall ist es ungewiss, ob die Funktion dies tut ob Sie das Eigentum am Zeiger beanspruchen oder nicht. Die Implementierung von Base::Base(std::unique_ptr
Übergabe der Const-L-Wert-Referenz (keine Eigentumsübertragung)
Base(std::unique_ptr<Base> const &n);
Die Übergabe einer const L-Wert-Referenz verhindert, dass die Funktion den Besitz des Zeigers beansprucht. Die Funktion kann auf das angezeigte Objekt zugreifen, seinen Wert jedoch nicht ändern.
Übergabe einer R-Wert-Referenz (potenzielle Eigentumsübertragung)
Base(std::unique_ptr<Base> &&n) : next(std::move(n)) {}
Dieser Ansatz ähnelt Übergabe einer nicht konstanten L-Wert-Referenz. Es erlaubt die Übergabe temporärer Objekte:
Base newBase(std::unique_ptr<Base>(new Base)); // Legal
Es erfordert jedoch die Verwendung von std::move bei der Übergabe nicht temporärer Argumente. Die Funktion kann den Besitz des Zeigers beanspruchen oder auch nicht, wodurch ihr Verhalten ohne Prüfung der Implementierung weniger offensichtlich wird.
Empfehlungen
Einzigartig manipulieren Zeiger
So bearbeiten Sie eindeutige Zeiger:
Das obige ist der detaillierte Inhalt vonWie soll ich in C eindeutige Zeiger als Funktionsparameter übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!