Heim >Backend-Entwicklung >C++ >Wie soll ich in C eindeutige Zeiger als Funktions- oder Konstruktorargumente übergeben?

Wie soll ich in C eindeutige Zeiger als Funktions- oder Konstruktorargumente übergeben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-30 22:34:10328Durchsuche

How Should I Pass Unique Pointers as Function or Constructor Arguments in C  ?

Eindeutige Zeiger als Parameter in Konstruktoren und Funktionen verwalten

Eindeutige Zeiger (unique_ptr) wahren das Prinzip des eindeutigen Besitzes in C 11. Beim Umgang Bei eindeutigen Zeigern als Funktions- oder Konstruktorargumente ergeben sich bei eindeutigen Zeigern mehrere Optionen Implikationen.

Wertübergabe:

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

Diese Methode überträgt den Besitz des eindeutigen Zeigers auf die Funktion/das Objekt. Der Inhalt des Zeigers wird in die Funktion verschoben, sodass der ursprüngliche Zeiger nach der Operation leer bleibt.

Übergabe einer nicht konstanten L-Wert-Referenz:

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

Ermöglicht Die Funktion kann sowohl auf den eindeutigen Zeiger zugreifen als auch möglicherweise dessen Besitz beanspruchen. Dieses Verhalten ist jedoch nicht garantiert und erfordert eine Überprüfung der Funktionsimplementierung, um festzustellen, wie sie mit dem Zeiger umgeht.

Übergabe der Const-L-Wert-Referenz:

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

Verhindert, dass die Funktion den Besitz des eindeutigen Zeigers beansprucht. Auf den Zeiger kann zugegriffen, aber nicht gespeichert oder geändert werden.

Übergabe per R-Wert-Referenz:

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

Vergleichbar mit der Übergabe per nicht konstanter L-Wert-Referenz , erfordert jedoch die Verwendung von std::move bei der Übergabe nicht temporärer Argumente. Das Eigentum kann von der Funktion beansprucht werden oder nicht, was es weniger vorhersehbar macht.

Empfehlungen:

  • Wert übergeben: Für Funktionen, die erwarten, den Besitz des eindeutigen Zeigers zu beanspruchen.
  • Übergabe von Const L-Value Referenz: Wenn die Funktion vorübergehenden Zugriff auf den Zeiger benötigt.
  • Erwägen Sie alternative Ansätze: Vermeiden Sie die Übergabe der R-Wert-Referenz, da dies zu Unsicherheit über den Besitz führt.

Eindeutige Zeiger manipulieren:

Um einen eindeutigen Zeiger zu verschieben, Verwenden Sie std::move. Das Kopieren eines eindeutigen Zeigers ist nicht zulässig:

std::unique_ptr<Base> newPtr(std::move(oldPtr));

Das obige ist der detaillierte Inhalt vonWie soll ich in C eindeutige Zeiger als Funktions- oder Konstruktorargumente übergeben?. 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