Zuweisungsoperator verschieben und if (this != &rhs)
Im Kopierzuweisungsoperator einer Klasse ist dies gängige Praxis um zu prüfen, ob das zugewiesene Objekt das aufrufende Objekt ist, um eine Selbstzuweisung zu verhindern:
Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // Do the assignment } return *this; }
Diese Prüfung ist von entscheidender Bedeutung für verhindern, dass das Objekt sich selbst zugewiesen wird, was zu unerwartetem Verhalten oder Fehlern führen kann. Im Fall des Umzugszuweisungsoperators ist die Notwendigkeit dieser Prüfung jedoch umstritten.
Brauchen wir die gleiche Prüfung für den Umzugszuweisungsoperator?
Class& Class::operator=(Class&& rhs) { if (this != &rhs) { // Do the assignment } return *this; }
Es stellt sich die Frage, ob es Situationen geben kann, in denen dies == &rhs für den Verschiebungszuweisungsoperator zutrifft. Die Antwort hängt von der Interpretation des Verschiebungszuweisungsoperators ab.
Interpretationen des Verschiebungszuweisungsoperators:
Es gibt zwei Hauptinterpretationen des Verschiebungszuweisungsoperators:
Aktuelle und zukünftige Standards:
Der C 11 Der Standard schreibt nicht ausdrücklich eine spezifische Interpretation des Verschiebungszuweisungsoperators vor. Es ermöglicht dem Programmierer jedoch, das Verhalten durch die Implementierung des Verschiebungszuweisungsoperators zu definieren.
Der vorgeschlagene C 20-Arbeitsentwurf enthält einen Abschnitt zur Bewegungszuweisung, der vorschlägt, dass die Selbstbewegungszuweisung nicht abstürzen sollte, sondern Es wird nicht angegeben, ob der aktuelle Wert beibehalten oder das Objekt in einem gültigen, aber nicht spezifizierten Zustand belassen werden soll Zustand.
Schlussfolgerung:
Die Notwendigkeit der if (this != &rhs)-Prüfung im Verschiebungszuweisungsoperator ist eine Frage der Interpretation und spezifischer Implementierungsanforderungen. Wenn erwartet wird, dass die Selbstbewegungszuweisung den aktuellen Wert beibehält, ist die Prüfung erforderlich. Andernfalls kann es als Optimierung weggelassen werden.
Das obige ist der detaillierte Inhalt vonBrauchen wir die Prüfung „if (this != &rhs)' in C-Zuweisungsoperatoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!