Wäre es empfehlenswert, einen "Gültigkeits" -Zustand für bewegliche Objekte zu speichern?

8

Ich entwerfe eine Bibliothek, viele der Klassen sind beweglich. Viele der beweglichen Klassen werden als Argumente an Funktionen anderer Klassen übergeben. Ich überlege, wie ich den Code für Validierungsprüfungen minimieren kann. Die Instanzen der beweglichen Klassen befinden sich nach dem Konstruieren immer in einem gültigen Zustand, werden jedoch nach dem Verschieben ungültig.

Wäre es eine gute Übung, ein Flag "gültig" zu haben, das nach dem Konstruieren wahr ist und nach dem Verschieben falsch wird. Die einzige Möglichkeit, das Objekt wieder gültig zu machen, ist, wenn ein gültiges Objekt in das Objekt verschoben wird.

Ich werde auch erwähnen, dass nach dem Verschieben der Objekte nicht in einen Zustand gehen, in dem das Aufrufen von Funktionen auf ihnen ein undefiniertes Verhalten oder irgendetwas verursachen würde. Es ist nur, dass nach dem Verschieben der Inhalte Müll sind.

    
NFRCR 24.03.2014, 08:38
quelle

1 Antwort

8

SOLLTE ICH, ODER SOLLTE ICH NICHT?

Ein solches Flag ist möglicherweise für Debugging-Zwecke geeignet, aber normalerweise ist es Sache des Entwicklers, der Ihre Bibliothek / Code verwendet, um sicherzustellen, dass er Ihre Objekte niemals auf eine Weise verwendet eigenartig, nachdem sie benutzt worden sind.

Der Hauptzweck von move-constructors und move-assignments besteht darin, die Daten von src nach dst zu verschieben, wodurch src praktisch nichts enthält aber Müll, und ein Entwickler, der solche Funktionalität verwendet, sollte sich dessen bewusst sein.

Hinweis: Konstrukte, die niemals schlecht formatiert sein sollten, enthalten den (die) Zuweisungsoperator (en). Man sollte immer in der Lage sein, einem moved-from Objekt.

Da sich ein move von einem Objekt, auf das über eine Variable zugegriffen wird (dh ein lvalue ), nur dann ergibt, wenn der Entwickler das explizit so sagt 1) Der Entwickler hat mit einem solchen Code einen unsichtbaren Vertrag unterschrieben, der ihn für jegliche Nebeneffekte der Nutzung des Objekts nach dem Verschieben verantwortlich macht.

Hinweis: 1) über std::move (val) , static_cast<T&&> (val) oder gleichwertig.

DIE STANDARDBIBLIOTHEK

Wenn wir in der Standard-Bibliothek nachsehen, sehen wir, dass es in der Praxis kein valid -Flag gibt, stattdessen ist es (wie gesagt) Sache des Entwicklers sicherzustellen, dass er keine ungültigen Konstrukte auf einem verschobenen Element verwendet Objekt.

    
Filip Roséen - refp 24.03.2014, 08:48
quelle

Tags und Links