Soll das verschobene Objekt in einem "sicheren" Zustand bleiben? [Duplikat]

8

Wenn das moved-from-Objekt in einem C ++ 11-Zustand implementiert wird, sollte es in einem sicheren -Zustand verbleiben oder kann es einfach in einem "junk" -Zustand belassen werden?

z.B. Was ist die bevorzugte Option, um den move -Konstruktor im folgenden Beispiel eines C ++ 11-Wrappers in eine rohe FILE* -Ressource zu implementieren?

%Vor%     
Mr.C64 30.10.2012, 11:12
quelle

2 Antworten

6

Das einzige, was Sie müssen können, wenn Sie ein verschobenes Objekt verwenden, ist es, es zu zerstören. Darüber hinaus liegt es an Eurer Klasse, was die normalen Klasseninvarianten sind und ob sie von Objekten verschoben werden, um sie zu befriedigen.

Zum Beispiel ist es eine gute Idee, sicherzustellen, dass Sie dem Objekt zuweisen können, nur für den Fall, dass jemand std::move für eine Instanz verwenden und ihm später einen neuen Wert geben möchte. [Edit: Wie in einer Antwort auf eine der vorgeschlagenen Duplikate-Fragen gezeigt, bewegt sich die allgemeine std::swap -Schablone von einem Objekt und dann move-weist sie diesem zu. Wenn Sie dies nicht sicherstellen, müssen Sie entweder spezialisieren std::swap oder Sie müssen Benutzern Ihrer Klasse verbieten, sie zu benutzen.]

Da Ihre Klasse nichts in ihrem Destruktor tut, ist jede Option in Ordnung. Option 2 ist für die Benutzer möglicherweise einfacher zu handhaben, aber wenn sie unter der Annahme programmieren, dass sie mit einem verschobenen Objekt nichts anfangen können, macht das keinen Unterschied. Da die Klasse jedoch unvollständig ist, kann sich das ändern, wenn Sie den Destruktor schreiben.

    
Steve Jessop 30.10.2012, 11:22
quelle
6

Ein Objekt, von dem aus es verschoben wurde, ist immer noch ein Objekt und muss in einem gültigen Zustand sein, obwohl es unbestimmt sein kann. Insbesondere sollte es möglich sein, ihm einen neuen Wert sicher zuzuweisen (und natürlich muss er zerstörbar sein, wie @Steve sagt). Es liegt an Ihnen, welche Semantik Sie Ihrer Klasse geben möchten, solange ein verschobenes Objekt gültig bleibt.

Im Allgemeinen sollten Sie sich "Verschieben" als eine optimierte "Kopie" vorstellen. Für einige Klassen, die eigentlich nur "move-only" sind, wie zum Beispiel unique_ptr , können zusätzliche Garantien angebracht sein - zum Beispiel verspricht unique_ptr , dass, nachdem es verschoben wurde - es null ist und sicherlich nichts anderes macht Sinn.

(Ihr tatsächlicher Code ist unvollständig, aber da ein FILE* eine Art reine Verschiebungsressource ist, ist es wahrscheinlich kaputt und Sie sollten versuchen, unique_ptr so genau wie möglich zu emulieren - oder sogar verwende es direkt .)

    
Kerrek SB 30.10.2012 11:29
quelle

Tags und Links