Heim >Backend-Entwicklung >C++ >Warum verhindert ein benutzerdefinierter Raumschiffbetreiber in C 20 den automatischen Gleichheitsvergleich?
Der Raumschiffoperator und Gleichheitsvergleich
Der Raumschiffoperator C 20 (auch bekannt als <=>) führt eine praktische und prägnante Syntax ein zum Vergleichen von Werten. In bestimmten Szenarien werden jedoch möglicherweise nicht die erwarteten Gleichheits- und Ungleichheitsoperatoren (== und !=) generiert. Diese Frage untersucht dieses Verhalten und warum eine benutzerdefinierte Raumschiff-Operator-Implementierung die Erstellung dieser zusätzlichen Operatoren verhindern kann.
Problembeschreibung
Beachten Sie den folgenden Codeausschnitt, in dem der Raumschiff-Operator steht wird in einer Struktur mit einer Standardimplementierung verwendet:
struct X { int Dummy = 0; auto operator<=>(const X& other) const = default; // Default implementation };
Dieser Code lässt sich fehlerfrei kompilieren. Wenn wir jedoch eine benutzerdefinierte Raumschiff-Operator-Implementierung definieren:
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
Der Compiler gibt einen Fehler aus, wenn er versucht, den Gleichheitsoperator (==) zu verwenden:
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
Erläuterung
Dieses Verhalten ist im Sinne des Sprachstandards beabsichtigt. Wenn eine Klasse über einen Standard-Raumschiffoperator verfügt, synthetisiert der Compiler eine Standardimplementierung des Gleichheitsoperators. Wenn der Raumschiff-Operator jedoch mit einer benutzerdefinierten Definition implementiert wird, generiert der Compiler den Gleichheitsoperator nicht automatisch.
Diese Unterscheidung ergibt sich aus Bedenken hinsichtlich der Effizienz. Der Raumschiff-Operator soll eine vollständige Reihenfolge der Werte bereitstellen, während der Gleichheitsoperator (==) Optimierungen durchführen kann, z. B. Größenvergleiche, bevor ein vollständiger Vergleich versucht wird. Für Klassen wie std::vector ist die Verwendung des Spaceship-Operators für Gleichheitsvergleiche möglicherweise nicht der effizienteste Ansatz.
Indem der Compiler es dem Programmierer überlässt, den Gleichheitsoperator zu implementieren, vermeidet er die Möglichkeit der Generierung eines Non -optimale Umsetzung. Wenn eine Klasse also einen nicht standardmäßigen Raumschiffoperator hat, muss der Entwickler auch den Gleichheitsoperator explizit definieren.
Das obige ist der detaillierte Inhalt vonWarum verhindert ein benutzerdefinierter Raumschiffbetreiber in C 20 den automatischen Gleichheitsvergleich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!