Heim >Backend-Entwicklung >C++ >Kann ich ein „std::unique_ptr' ohne „std::move' in C zurückgeben?

Kann ich ein „std::unique_ptr' ohne „std::move' in C zurückgeben?

Susan Sarandon
Susan SarandonOriginal
2024-12-15 02:42:09464Durchsuche

Can I Return a `std::unique_ptr` Without `std::move` in C  ?

Zurückgeben eines std::unique_ptr ohne std::move

In C erzwingt std::unique_ptr die Verschiebungssemantik, um den mehrfachen Besitz von Objekten zu verhindern. Es ist jedoch möglich, einen unique_ptr von einer Funktion zurückzugeben, ohne std::move aufzurufen. Dieses Verhalten kann auf eine Sprachfunktion namens Copy Elision zurückgeführt werden.

Copy Elision

Gemäß der C-Sprachspezifikation (12.8 §34 und §35) ist es einer Implementierung erlaubt, zu eliden (wegzulassen). ) Kopier-/Verschiebevorgänge, wenn bestimmte Kriterien erfüllt sind. Insbesondere ist die Kopierelision in einer Rückgabeanweisung für einen Klassenrückgabetyp zulässig, vorausgesetzt, dass der Ausdruck der Name eines nichtflüchtigen automatischen Objekts mit demselben cv-unqualifizierten Typ wie der Funktionsrückgabetyp ist.

Elision in unique_ptr-Rückgabeanweisungen

In dem von Ihnen bereitgestellten Beispielcode:

unique_ptr<int> foo()
{
  unique_ptr<int> p(new int(10));
  return p;  // Line 1
}

p ist ein nichtflüchtiges automatisches Objekt das den gleichen Typ wie der Funktionsrückgabetyp hat, unique_ptr. Daher ist es dem Compiler gestattet, die Kopierkonstruktion von p zu eliminieren.

Wenn der Compiler auf Zeile 1 trifft, führt er zunächst eine Überladungsauflösung durch, um den Konstruktor für den Kopiervorgang auszuwählen, als ob p durch einen R-Wert angegeben wäre. Da jedoch die Elisionskriterien erfüllt sind, wird die Kopierkonstruktion eliminiert und der zurückgegebene Wert wird zu einem verschobenen unique_ptr.

Auswirkungen auf Best Practices

Es ist wichtig zu beachten, dass die Rückgabe nach Wert erfolgt sollte in diesem Szenario die Standardauswahl sein. Bei Kopierelision wird ein benannter Wert in der Return-Anweisung als R-Wert behandelt. Dies bedeutet, dass der zurückgegebene unique_ptr auch ohne explizite Verwendung von std::move aus dem temporären Objekt der Funktion verschoben werden kann.

Die Rückgabe per Referenz oder die Verwendung von std::make_unique sind beides praktikable Alternativen, um das Eliminieren von Kopien zu vermeiden und die Explizitheit sicherzustellen Eigentumsübertragung.

Das obige ist der detaillierte Inhalt vonKann ich ein „std::unique_ptr' ohne „std::move' in C zurückgeben?. 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