Heim >Backend-Entwicklung >C++ >Eliminiert das Überladen von Operatoren undefiniertes Verhalten in Ausdrücken wie „i = i' mit benutzerdefinierten Typen?

Eliminiert das Überladen von Operatoren undefiniertes Verhalten in Ausdrücken wie „i = i' mit benutzerdefinierten Typen?

DDD
DDDOriginal
2024-12-22 19:27:13891Durchsuche

Does Overloading Operators Eliminate Undefined Behavior in Expressions like `i  =   i` with User-Defined Types?

Undefiniertes Verhalten und Sequenzpunkte überarbeitet

Der Ausdruck i = i wurde als undefiniertes Verhalten aufrufend gekennzeichnet, wenn i ein integrierter Typ ist . Es wirft jedoch Fragen zum Verhalten ähnlicher Ausdrücke auf, wenn i ein benutzerdefinierter Typ ist.

Überlegungen zu benutzerdefinierten Typen

Der Typindex ist definiert als:

class Index {
    int state;

    public:
        Index(int s) : state(s) {}
        Index& operator++() {
            state++;
            return *this;
        }
        Index& operator+=(const Index &index) {
            state += index.state;
            return *this;
        }
        operator int() {
            return state;
        }
        Index& add(const Index &index) {
            state += index.state;
            return *this;
        }
        Index& inc() {
            state++;
            return *this;
        }
};

Würde Ausdrücke wie i.operator =(i.operator ()); oder i.add(i.inc()); immer noch undefiniertes Verhalten hervorrufen?

Auswirkungen auf Sequenzpunkte

Der Ausdruck i.operator =(i.operator ()); ruft kein undefiniertes Verhalten auf, weil:

  • Überladene Operatoren sind Funktionen, die Sequenzpunkte vor und nach ihrer Auswertung haben.
  • Die Aufrufe von „operator ()“ und „operator =()“ haben also gute Eigenschaften -definierte Sequenzpunkte.
  • Daher verhält sich der Ausdruck wie erwartet, ohne den Sequenzpunkt zu verletzen Regeln.

Überlegungen zum Nichtausdruck

Der ursprüngliche Ausdruck i = i wirft die Frage auf, ob es sich überhaupt um einen Ausdruck handelt. Ist dies nicht der Fall, unterliegt es möglicherweise nicht den Sequenzpunktregeln. Es ist jedoch unwahrscheinlich, dass dieses Argument zutrifft, da es als Ausdruck analysiert und ausgeführt wird.

Mehrere Modifikationen

Der andere Interessenausdruck, a[ i] = i , wirft aufgrund der möglichen Änderungen zwischen Sequenzpunkten auch Fragen auf. Es ist jedoch wohldefiniert, wenn a ein benutzerdefinierter Typ ist, der den Indexoperator überlädt.

Ausdruckskomplexität

Der Ausdruck i ist in C wohldefiniert 03, weil es äquivalent zu ((i.operator ()).operator ()).operator () ist, das genau definierte Sequenzpunkte zwischen Funktionen hat Auswertungen.

Fazit

Das Verhalten von Ausdrücken mit benutzerdefinierten Typen und Sequenzpunkten hängt von der spezifischen Implementierung der Operatoren ab. Überladene Operatoren verhalten sich wie Funktionen und stellen Sequenzpunkte bereit. Ob ein Ausdruck jedoch Sequenzpunktregeln unterliegt, kann von seiner syntaktischen Struktur und Interpretation als Ausdruck abhängen.

Das obige ist der detaillierte Inhalt vonEliminiert das Überladen von Operatoren undefiniertes Verhalten in Ausdrücken wie „i = i' mit benutzerdefinierten Typen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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