Heim > Backend-Entwicklung > C++ > Hauptteil

Warum kann ich „==' und „!=' nicht mit einem benutzerdefinierten „<=>'-Operator in C 20 verwenden?

Linda Hamilton
Freigeben: 2024-11-07 21:11:03
Original
986 Leute haben es durchsucht

Why Can't I Use `==` and `!=` with a Custom `<=>` Operator in C 20? 
` 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&amp;) const = default; // Default implementation
};
Nach dem Login kopieren

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

Benutzerdefinierte Implementierungsblöcke == und !=

Wenn jedoch eine benutzerdefinierte Implementierung von <=> bereitgestellt wird:

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp; other) const {
        return Dummy <=> other.Dummy;
    }
};
Nach dem Login kopieren

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

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!

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!