` Operator in C 20? " />
Nicht standardmäßiger Operator <=> und das Fehlen von == und !=
In C 20 ist der Raumschiffoperator <=> ; bietet einen allgemeinen Vergleichsmechanismus. Bei Verwendung einer benutzerdefinierten Drei-Wege-Vergleichsimplementierung tritt jedoch ein seltsames Verhalten auf.
Standardimplementierung generiert == und !=
Betrachten Sie den folgenden Code mit der Standardimplementierung von <=>:
struct X { int Dummy = 0; auto operator<=>(const X&) const = default; // Default implementation };
In diesem Fall wird der Code erfolgreich kompiliert und ermöglicht die Verwendung von == und != zum Vergleich von Instanzen von X:
X a, b; a == b; // OK!
Benutzerdefinierte Implementierungsblöcke == und !=
Wenn jedoch eine benutzerdefinierte Implementierung von <=> bereitgestellt wird:
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
Das Kompilieren führt zu dem Fehler:
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
Grund für das Verhalten
Dieses Verhalten ist gemäß C 20-Standard beabsichtigt:
Wenn die Klassendefinition nicht explizit eine ==-Operatorfunktion, sondern eine standardmäßige Drei-Wege-Vergleichsfunktion deklariert, wird eine ==-Operatorfunktion implizit mit demselben Zugriff wie die Drei-Wege-Vergleichsoperatorfunktion deklariert .
Nur ein standardmäßiger <=> Der Operator generiert ein synthetisiertes ==. Dies liegt daran, dass Klassen wie std::vector kein nicht standardmäßiges <=> verwenden sollten. für Gleichheitstests, da sie möglicherweise weniger effizient ist als eine benutzerdefinierte Implementierung.
Wenn eine Klasse daher eine benutzerdefinierte <=> Implementierung muss der Programmierer auch eine benutzerdefinierte ==-Implementierung bereitstellen, um ein korrektes Vergleichsverhalten sicherzustellen.
Das obige ist der detaillierte Inhalt vonWarum kann ich „==' und „!=' nicht mit einem benutzerdefinierten „<=>'-Operator in C 20 verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!