Um der Beste zu schlechter:
- Funktion (const T &);
- someFunction (T &);
- someFunction (const std :: eindeutiges_ptr <T> &);
- someFunction (std :: unique_ptr <T> &);
Die erste ist die beste, weil es nicht das Objekt, um es nicht ändern und es wird ganz gleich mit dem Objekt arbeiten, wie Sie es zugewiesen haben (zum Beispiel, könnten Sie wechseln ohne Probleme Shared_ptr).
Nummer zwei funktioniert auch unabhängig davon, welchen Smart Pointer Sie verwenden; Es wird jedoch davon ausgegangen, dass Sie das Objekt ändern können und wann immer Sie etwas const machen können, sollten Sie.
Die Nummern 3 und 4 erlauben beide, dass das Objekt, auf das hingewiesen wird, mutiert wird; # 3 lässt jedoch nicht zu, dass der intelligente Zeiger geändert wird, während Nummer 4 dies tut. Beide haben den Nachteil, dass sie die Verwendung von unique_ptr erzwingen, während die beiden darüber unabhängig von der Smart-Pointer-Klasse funktionieren würden.
Das Übergeben eines unique_ptr nach Wert, wie Sie in einigen der anderen Beispiele haben, ist keine Option; Ein unique_ptr soll einzigartig sein. Wenn Sie es kopieren, sollten Sie shared_ptr verwenden.
Für die ersten beiden, wenn Sie es auf das Ergebnis zurück() geltend gemacht, würde es wie folgt aussehen:
someFunction(*(lst.back())); // dereference lst.back() before passing it in.
Für die beiden letzteren, wenn Sie es auf dem resut von hinten() aufgerufen, es würde so aussehen:
someFunction(lst.back()); // pass the smart pointer, not the object to
// which the smart pointer currently points.
Danke für die eingehende Erklärung. Daher ist keine spezielle Semantik für intelligente Zeiger erforderlich (außer der Dereferenzierung). Ich wusste von dem 'const'-Zeug, aber in diesem Fall muss ich das übergebene' T'-Objekt modifizieren. – rubenvb