Heim > Backend-Entwicklung > C++ > Brauchen wir die Prüfung „if (this != &rhs)' in C-Zuweisungsoperatoren?

Brauchen wir die Prüfung „if (this != &rhs)' in C-Zuweisungsoperatoren?

Mary-Kate Olsen
Freigeben: 2024-12-05 22:16:11
Original
611 Leute haben es durchsucht

Do We Need the `if (this != &rhs)` Check in C   Move Assignment Operators?

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;
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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:

  1. Behält den aktuellen Wert bei: Einige argumentieren, dass die Selbstbewegungszuweisung (wobei dies == &rhs) sollte den aktuellen Wert des Objekts beibehalten. In diesem Fall ist die if (this != &rhs)-Prüfung notwendig, um eine versehentliche Selbstzuweisung zu verhindern.
  2. Setzt auf einen gültigen Zustand: Andere argumentieren, dass der Self-Move-Assignment-Operator sollte nicht unbedingt den aktuellen Wert beibehalten, sondern das Objekt in einem gültigen Zustand belassen. In diesem Fall ist die if (this != &rhs)-Prüfung nicht unbedingt erforderlich. Es kann jedoch dennoch als Optimierung nützlich sein, um die Durchführung des Verschiebungsvorgangs bei Selbstzuweisung zu vermeiden.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage