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_ptr muss der Originalzeiger auf null gesetzt werden, weil sonst zwei Destruktoren den Speicher freigeben.

    Für simple int s 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_ptr muss der Originalzeiger auf null gesetzt werden, weil sonst zwei Destruktoren den Speicher freigeben.

    Für simple int s 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!


Anmelden zum Antworten