Verfügen integrierte Typen über Bewegungssemantik und definieren das Verhalten nach der Bewegung?
Das bereitgestellte Codefragment zeigt die offensichtliche Änderung eines Builds -in-Typ (int) innerhalb einer Funktion, die einen R-Wert-Verweis darauf erhält. Das Konzept der „Bewegungssemantik“ wirft jedoch Fragen zum tatsächlichen Verhalten integrierter Typen in diesem Zusammenhang auf.
Eingebaute Typen und Bewegungssemantik verstehen
Integrierte Typen verfügen im Gegensatz zu benutzerdefinierten Typen nicht über Ressourcen und verwalten auch keinen eigenen Speicher. Stattdessen sind sie die Ressourcen selbst. Das Verschieben eines Objekts impliziert die Übertragung des Eigentums an seinen Ressourcen. Dies gilt nicht für integrierte Typen, da diese keine externen Ressourcen enthalten.
Auswirkungen von std::move auf integrierte Typen
std::move wandelt einen L-Wert in einen X-Wert um und ermöglicht so die Bindung an R-Wert-Referenzen. Es löst keine Konstruktoren aus und verursacht keine Laufzeitaktionen. Auf Typebene wird lediglich die Wertkategorie geändert.
Rvalue-Referenzen und -Änderungen
Rvalue-Referenzen bleiben Referenzen und stellen eine Verbindung zum ursprünglichen Objekt her. Wenn eine R-Wert-Referenz an eine Funktion übergeben wird, kann die Funktion das ursprüngliche Objekt über die Referenz ändern. Dies geschieht im bereitgestellten Beispiel, in dem die Funktion den ursprünglichen int erhöht.
Kein Move-Konstruktor für grundlegende Typen
Grundlegenden Typen wie Ints fehlt die Bewegung Konstrukteure. Wenn eine Funktion einen grundlegenden Typ als Wert erhält, degradiert die Verschiebung zu einer Kopie. Folglich wird der Wert des ursprünglichen Objekts in den Funktionsparameter kopiert und alle innerhalb der Funktion vorgenommenen Änderungen wirken sich nicht auf das ursprüngliche Objekt aus.
Gut definiertes Verhalten für integrierte Typen nach dem Verschieben
Das im Beispiel beobachtete Verhalten, bei dem der ursprüngliche int durch eine R-Wert-Referenz geändert wird, ist durch den C-Standard genau definiert. Dies ist das Ergebnis des Fehlens von Bewegungskonstruktoren und der Funktionalität von R-Wert-Referenzen.
Fazit
Während eingebaute Typen keine Bewegungssemantik besitzen Im herkömmlichen Sinne kann std::move auf sie angewendet werden, um R-Wert-Referenzen zu erstellen. Wenn diese R-Wert-Referenzen an Funktionen übergeben werden, ermöglichen sie Änderungen an den ursprünglichen Objekten. Allerdings verfügen grundlegende Typen nicht über Verschiebungskonstruktoren, sodass alle „Verschiebungs“-Operationen auf ihnen effektiv zu Kopien werden. Das Verhalten integrierter Typen nach dem Verschieben ist klar definiert und folgt den Prinzipien von R-Wert-Referenzen und dem Fehlen von Verschiebekonstruktoren für grundlegende Typen.
Das obige ist der detaillierte Inhalt vonWeisen integrierte Typen eine Bewegungssemantik auf, und wenn ja, wie definieren sie das Verhalten nach der Bewegung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!