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.
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.
Tags und Links c++