Heim >Backend-Entwicklung >C++ >Wie sollten „unique_ptr'-Parameter in C-Konstruktoren und -Funktionen übergeben werden?

Wie sollten „unique_ptr'-Parameter in C-Konstruktoren und -Funktionen übergeben werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-18 10:08:11212Durchsuche

How Should `unique_ptr` Parameters Be Passed in C   Constructors and Functions?

Wie unique_ptr-Parameter in Konstruktoren und Funktionen behandelt werden sollten

Szenario

Betrachten Sie eine Klasse Base verweist auf sich selbst als folgt:

class Base {
public:
  typedef unique_ptr<Base> UPtr;

  Base() {}
  Base(Base::UPtr n) : next(std::move(n)) {}

  virtual ~Base() {}

  void setNext(Base::UPtr n) {
    next = std::move(n);
  }

protected:
  Base::UPtr next;
};

Methoden zur Übergabe von unique_ptr-Argumenten

Um unique_ptr-Parameter effektiv zu nutzen, sollten Sie die folgenden Methoden in Betracht ziehen:

1. Nach Wert (A)

Base(std::unique_ptr<Base> n) : next(std::move(n)) {}

Beim Aufruf als Base newBase(std::move(nextBase)); überträgt diese Methode den Besitz des Zeigers auf die Funktion. Nach der Erstellung wird nextBase leer.

2. Durch nicht konstante L-Wert-Referenz (B)

Base(std::unique_ptr<Base> &n) : next(std::move(n)) {}

Dies erfordert einen tatsächlichen L-Wert (benannte Variable) und ermöglicht der Funktion, möglicherweise den Besitz des Zeigers zu beanspruchen.

3. Durch const l-value Reference (C)

Base(std::unique_ptr<Base> const &n);

Dies verhindert, dass die Funktion den Zeiger speichert, garantiert aber den Zugriff auf das Objekt für die Dauer seiner Ausführung.

4. Durch R-Wert-Referenz (D)

Base(std::unique_ptr<Base> &&n) : next(std::move(n)) {}

Ähnlich wie (B), erfordert jedoch die Verwendung von std::move bei der Übergabe nicht temporärer Argumente. Die Funktion kann Eigentum beanspruchen oder auch nicht.

Empfehlungen

  • Methode (A) sollte verwendet werden, wenn das Eigentum an der Funktion übertragen wird .
  • Methode (C) wird für Funktionen empfohlen, die einfach das verwenden unique_ptr für deren Dauer.
  • Methode (D) sollte aufgrund ihrer Mehrdeutigkeit hinsichtlich der Eigentumsübertragung vermieden werden.

Manipulation von unique_ptr

Um einen unique_ptr zu verschieben, verwenden Sie std::move. Dadurch wird ein Kopieren vermieden und eine ordnungsgemäße Eigentumsübertragung gewährleistet.

Das obige ist der detaillierte Inhalt vonWie sollten „unique_ptr'-Parameter in C-Konstruktoren und -Funktionen ü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