Heim  >  Artikel  >  Backend-Entwicklung  >  Verhindert die Verwendung eines benutzerdefinierten Raumschiffoperators die Generierung von Gleichheitsoperatoren in C?

Verhindert die Verwendung eines benutzerdefinierten Raumschiffoperators die Generierung von Gleichheitsoperatoren in C?

DDD
DDDOriginal
2024-11-09 17:56:02756Durchsuche

Does Using a Custom Spaceship Operator Prevent the Generation of Equality Operators in C  ?

Der Raumschiffoperator und seine Auswirkungen auf Gleichheitsoperatoren

Der in C 20 eingeführte Raumschiffoperator <=> bietet eine kurze Zusammenfassung Syntax für Drei-Wege-Vergleiche. Allerdings könnten Benutzer, die auf unerwartetes Verhalten stoßen, wenn sie sowohl den Raumschiff-Operator als auch die Gleichheitsoperatoren (== und !=) verwenden, überrascht sein.

Standardimplementierung und generierte Gleichheitsoperatoren

Wenn der Raumschiff-Operator als Standardwert deklariert wird (z. B. auto-Operator<=>(const X&) const = default;), kann der Compiler automatisch einen ==-Operator basierend auf dem zugrunde liegenden Vergleich generieren. Dies wird im folgenden Beispiel demonstriert:

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp;) const = default;
};

int main() {
    X a, b;

    a == b; // OK!
}

Benutzerdefinierte Implementierung und nicht generierte Gleichheitsoperatoren

Wenn jedoch eine benutzerdefinierte Implementierung des Raumschiffoperators bereitgestellt wird, Die generierten Gleichheitsoperatoren sind nicht mehr verfügbar. Dies wurde im Frageninhalt beobachtet, wo ein benutzerdefinierter Operator<=> Die Implementierung führte zu einem Fehler bei der Verwendung des Operators ==.

Begründung des Verhaltens

Dieses Verhalten ist beabsichtigt. Der C-Standard legt fest, dass nur ein standardmäßiger Raumschiffoperator die Generierung eines Gleichheitsoperators auslöst ([class.compare.default](https://eel.is/c draft/class.compare.default)). Der Grund dafür ist, dass bestimmte Klassen, wie z. B. std::vector, den Raumschiffoperator möglicherweise nicht für Gleichheitsprüfungen verwenden möchten, da dies möglicherweise nicht der effizienteste Ansatz ist.

Fazit

Daher muss bei der Definition eines benutzerdefinierten Raumschiffoperators beachtet werden, dass dadurch die automatische Generierung von Gleichheitsoperatoren entfällt. Wenn Gleichheitsprüfungen erforderlich sind, wird empfohlen, eine explizite Definition für den ==-Operator bereitzustellen.

Das obige ist der detaillierte Inhalt vonVerhindert die Verwendung eines benutzerdefinierten Raumschiffoperators die Generierung von Gleichheitsoperatoren in C?. 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