Heim >Backend-Entwicklung >C++ >Warum verhindert ein benutzerdefinierter Raumschiffbetreiber in C 20 den automatischen Gleichheitsvergleich?

Warum verhindert ein benutzerdefinierter Raumschiffbetreiber in C 20 den automatischen Gleichheitsvergleich?

Linda Hamilton
Linda HamiltonOriginal
2024-11-07 15:05:03197Durchsuche

Why Does a Custom Spaceship Operator in C  20 Prevent Automatic Equality Comparison?

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!

Stellungnahme:
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