(Warum) sollte ein Verschiebungskonstruktor oder Verschiebungszuweisungsoperator sein Argument löschen?

Eine Beispielimplementierung für einen Move-Konstruktor aus einem C ++ - Kurs sieht ungefähr so aus:

/// Move constructor
Motorcycle::Motorcycle(Motorcycle&& ori)
    : m_wheels(std::move(ori.m_wheels)),
      m_speed(ori.m_speed),
      m_direction(ori.m_direction)
{
    ori.m_wheels = array<Wheel, 2>();
    ori.m_speed      = 0.0;
    ori.m_direction  = 0.0;
}

(m_wheels ist ein Mitglied vom Typstd::array<Wheel, 2>, undRa enthält nur eindouble m_speed und einbool m_rotating. In demMotorra Klasse,m_speed undm_direction sind auchdoubles.)

Ich verstehe nicht ganz warumoriie Werte von @ müssen gelöscht werden.

Wenn einMotorcycleenn @ Zeigerelemente hatte, die wir "stehlen" wollten, müssen wir @ setzeori.m_thingy = nullptr, um zum Beispiel nichtdelete m_thingy zweimal. Aber spielt es eine Rolle, wann die Felder die Objekte selbst enthalten?

ch habe einen Freund danach gefragt, und er hat mich auf @ hingewiesediese Seit, was sagt

Move-Konstruktoren "stehlen" in der Regel die im Argument enthaltenen Ressourcen (z. B. Zeiger auf dynamisch zugewiesene Objekte, Dateideskriptoren, TCP-Sockets, E / A-Streams, ausgeführte Threads usw.), anstatt Kopien davon zu erstellen, und verlassen das Argument in einigengültiger aber sonst unbestimmter Zustand. Zum Beispiel von einemstd::string oder von einemstd::vector kann dazu führen, dass das Argument leer bleibt. Auf dieses Verhalten sollte man sich jedoch nicht verlassen.

Wer definiert wasunbestimmter Zustand meint? Ich verstehe nicht, wie ich die Geschwindigkeit auf @ stell0.0 ist nicht mehrunbestimm als es sein zu lassen. Und wie der letzte Satz im Zitat besagt, sollte sich der Code nicht auf den Zustand des ausgelagerten @ stützeMotorra sowieso, warum also die Mühe machen, es aufzuräumen?

Antworten auf die Frage(14)

Ihre Antwort auf die Frage