Heim >Backend-Entwicklung >C++ >Eliminiert das Überladen von Operatoren undefiniertes Verhalten in Ausdrücken wie „i = i' mit benutzerdefinierten Typen?
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:
Ü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!