Heim > Backend-Entwicklung > C++ > Warum erfordert die Rückgabe eines „std::unique_ptr' nicht „std::move()'?

Warum erfordert die Rückgabe eines „std::unique_ptr' nicht „std::move()'?

Susan Sarandon
Freigeben: 2024-12-22 18:03:10
Original
453 Leute haben es durchsucht

Why Does Returning a `std::unique_ptr` Not Require `std::move()`?

Warum einen std::unique_ptr ohne std::move() zurückgeben?

std::unique_ptr verhindert die Kopierkonstruktion und verwendet stattdessen die Bewegungssemantik. Es ist jedoch möglich, einen unique_ptr-Wert zurückzugeben. von einer Funktion ohne explizite Verwendung von std::move().

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;
}
Nach dem Login kopieren

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?

Sprachspezifikation ausnutzen

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:

  • Der Rückgabewert ist ein temporäres Objekt.
  • Der Das temporäre Objekt hat den gleichen Typ wie der Funktionsrückgabetyp.
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.

Fazit

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage