Heim > Backend-Entwicklung > C++ > Warum generiert ein benutzerdefinierter „Raumschiff'-Operator in C 20 keine „=='- und „!='-Operatoren?

Warum generiert ein benutzerdefinierter „Raumschiff'-Operator in C 20 keine „=='- und „!='-Operatoren?

Patricia Arquette
Freigeben: 2024-11-07 05:35:02
Original
386 Leute haben es durchsucht

Why Doesn't a Custom `spaceship` Operator Generate `==` and `!=` Operators in C  20?

Nicht standardmäßig <=> Operator und das Fehlen von == und !=

In C 20 hat der neu eingeführte Raumschiff-Operator (<=>) zu unerwartetem Verhalten bei der Generierung von ==- und !=-Operatoren geführt . Benutzer können auf Kompilierungsfehler stoßen, wenn sie einen nicht standardmäßigen Raumschiff-Operator mit benutzerdefinierten Implementierungen verwenden.

Standardmäßig vergleicht der Raumschiff-Operator zwei Objekte eines bestimmten Typs. Wenn eine Klasse nicht explizit einen ==-Operator, aber einen standardmäßigen, nicht standardmäßigen Raumschiffoperator definiert, generiert der Compiler automatisch einen ==-Operator mit demselben Zugriff wie der Raumschiffoperator. Dieses im Sprachstandard [class.compare.default] spezifizierte Verhalten stellt sicher, dass Klassen wie std::vector keine nicht standardmäßigen Raumschiffoperatoren für Gleichheitstests verwenden.

Allerdings, wenn der Raumschiffoperator dies nicht ist Standardmäßig (d. h. es verfügt über eine benutzerdefinierte Implementierung) generiert der Compiler keinen ==-Operator. Dies liegt daran, dass Klassen, die benutzerdefinierte Raumschiffoperatoren definieren, möglicherweise spezielle Implementierungen für == erfordern, um bestimmte Vergleichsszenarien zu verarbeiten. Somit überlässt es die Sprache dem Programmierer, den ==-Operator bei Bedarf explizit zu definieren.

Betrachten Sie beispielsweise den folgenden Code:

#include <compare>

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&) const = default; // Default implementation
};
Nach dem Login kopieren

Dieser Code wird aufgrund des Raumschiffs erfolgreich kompiliert Der Operator ist standardmäßig voreingestellt und der Compiler generiert den ==-Operator. Wenn wir jedoch den Raumschiff-Operator in eine benutzerdefinierte Implementierung ändern:

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

Der Code kann jetzt nicht kompiliert werden, und es wird ein Fehler angezeigt, der darauf hinweist, dass der ==-Operator nicht für Klasse X definiert ist. Dies liegt daran, dass der Der modifizierte Raumschiff-Operator ist nicht standardmäßig voreingestellt und der Compiler generiert nicht automatisch einen ==-Operator. In diesem Fall müsste der Benutzer den ==-Operator explizit definieren, um den Vergleichsanforderungen seiner benutzerdefinierten Klasse gerecht zu werden.

Das obige ist der detaillierte Inhalt vonWarum generiert ein benutzerdefinierter „Raumschiff'-Operator in C 20 keine „=='- und „!='-Operatoren?. 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