(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 auchdouble
s.)
Ich verstehe nicht ganz warumori
ie Werte von @ müssen gelöscht werden.
Wenn einMotorcycle
enn @ 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?