move konstruktor
-
Hi,
ich habe eine Frage zum Move Konstruktor. Innerhalb der Klasse rufe ich in der Initialisierungsliste auf dem Objekt Foo(Foo&& other) : myint(std::move(other.myint) usw. auf.
Innerhalb von {} kann man aber noch Zuweisungen vornehmen. Wozu sollen die gut sein, wenn ich das Objekt ohnehin verschiebe?

-
Schreib mal einen Move-Konstruktor für eine Klasse die als Member ein C-Handle hält. (z.B. FILE*)
-
Warum sollte es nicht gut sein, nachtraeglich Funktionen im Konstruktor aufzurufen?
-
Du kannst irgendwas im Move-Konstruktor tun, C++ schränkt dich dabei nicht ein.
Meistens genügt die Initialisierungsliste, aber nicht immer. Wenn du z.B. Member hast, die selbst nicht movable sind, aber z.B. eine
swap()-Methode anbieten, kannst du diese aufrufen. Und teilweise musst du die Member des Quell-Objektes explizit in einen Nullzustand zurückversetzen, damit der Destruktor nicht aufräumt.
-
Ja, das man im Konstruktor noch andere Aufrufe tätigen kann und es nicht verschiebbare Elemente geben kann, ist schon klar.
Aber ich sehe desöfteren das innerhalb von {} noch other.myint = 0; usw, steht. Das bedeutet die Daten von other werden explizit gesetzt.
-
Nexus schrieb:
Und teilweise musst du die Member des Quell-Objektes explizit in einen Nullzustand zurückversetzen, damit der Destruktor nicht aufräumt.
Zum Beispiel bei der Implementierung von
unique_ptrmuss der Originalzeiger auf null gesetzt werden, weil sonst zwei Destruktoren den Speicher freigeben.Für simple
ints ohne davon abhängige Logik/Invarianten ist das Ganze natürlich sinnlos. Aber es gibt auch Leute, die im Destruktor Variablen auf Null setzen.
-
Nexus schrieb:
Nexus schrieb:
Und teilweise musst du die Member des Quell-Objektes explizit in einen Nullzustand zurückversetzen, damit der Destruktor nicht aufräumt.
Zum Beispiel bei der Implementierung von
unique_ptrmuss der Originalzeiger auf null gesetzt werden, weil sonst zwei Destruktoren den Speicher freigeben.Für simple
ints ohne davon abhängige Logik/Invarianten ist das Ganze natürlich sinnlos. Aber es gibt auch Leute, die im Destruktor Variablen auf Null setzen.Ok, hab ich verstanden. Danke!