std::unique_ptr
Betrachten Sie den folgenden Codeausschnitt:
unique_ptr<int> foo() { unique_ptr<int> p(new int(10)); return p; // Line 1 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; }
Zeile 1 gibt einen unique_ptr ohne std::move() zurück. Überraschenderweise wird der Code wie vorgesehen kompiliert und funktioniert. Wie ist das also möglich, ohne den Kopierkonstruktor aufzurufen?
Der Schlüssel zum Verständnis dieses Verhaltens liegt in der C-Sprachspezifikation. Im Einzelnen beschreiben Abschnitt 12.8 §34 und §35 die Eliminierung von Kopien:
Wenn bestimmte Kriterien erfüllt sind, darf eine Implementierung die Kopier-/Verschiebungskonstruktion eines Klassenobjekts weglassen [...].
In diesem Fall ist Kopierelision zulässig, weil:
Wenn die Kriterien für die Elision eines Kopiervorgangs erfüllt sind und das zu kopierende Objekt durch einen L-Wert angegeben wird, erfolgt die Überladungsauflösung zur Auswahl des Konstruktors denn die Kopie wird zunächst so durchgeführt, als ob das Objekt durch einen R-Wert gekennzeichnet wäre.
Dies impliziert, dass der Rückgabewert zwar ein benanntes Objekt (ein L-Wert) ist, die Überlastungsauflösung ihn jedoch dennoch als ein Objekt betrachtet Wert. Daher wird der Verschiebungskonstruktor nicht aufgerufen und der zurückgegebene unique_ptr wird erfolgreich erstellt.
Die Möglichkeit, einen unique_ptr ohne std::move() zurückzugeben, ist eine subtile Funktion von C Sprachspezifikation. Es ist nicht erforderlich, std::move() explizit zu verwenden, wenn ein unique_ptr von einer Funktion zurückgegeben wird, solange die Bedingungen für die Kopierelision erfüllt sind. Dies kann dazu beitragen, die Klarheit des Codes zu verbessern und unnötige Verschiebungsvorgänge zu reduzieren.
Das obige ist der detaillierte Inhalt vonWarum erfordert die Rückgabe eines „std::unique_ptr' nicht „std::move()'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!