In C wird die Funktion std::move verwendet, um den Besitz eines Objekts zu übertragen. Es stellt sich jedoch häufig die Frage: Warum ist es möglich, std::move für ein const-Objekt aufzurufen? Ist das nicht kontraintuitiv und potenziell gefährlich?
Der Trick liegt in der Tatsache, dass std::move(const_object) keine tatsächliche Bewegung ausführt. Stattdessen wird der Compiler angewiesen, einen Verschiebungsversuch durchzuführen. Wenn die Klasse keinen Konstruktor hat, der einen konstanten Verweis auf einen R-Wert (Verschiebekonstruktor) akzeptiert, verwendet der Compiler standardmäßig den impliziten Kopierkonstruktor.
Betrachten Sie das folgende Beispiel:
struct Cat { Cat(){} Cat(const Cat&) {std::cout << "COPY";} Cat(Cat&&) {std::cout << "MOVE";} }; int main() { const Cat cat; Cat cat2 = std::move(cat); // prints "COPY" }
Wie Sie sehen können, erstellt der Compiler cat2 sicher als Kopie, obwohl cat ein const-Objekt ist. Dies liegt daran, dass in diesem Beispiel kein Move-Konstruktor für const-Objekte verfügbar ist.
Die potenzielle Gefahr, die Scott Meyers in „Effective Modern C“ hervorgehoben hat, ist eher ein Leistungsproblem als ein Stabilitätsproblem. Im Wesentlichen führt der Versuch, von einem const-Objekt zu verschieben, wenn kein Move-Konstruktor verfügbar ist, zu einer weniger effizienten Kopie.
Obwohl es logisch erscheinen mag, std::move daran zu hindern, auf const-Objekten zu arbeiten, ist es das auch Aus folgenden Gründen keine einfache Lösung:
Das obige ist der detaillierte Inhalt vonKönnen Sie von einem Const-Objekt in C wechseln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!