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.
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.
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
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.
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!