Am 11.11.2017 nahm das ISO C ++ - Komitee den Vorschlag von Herb Sutter für den Dreiwege-Vergleichsoperator <=> "Raumschiff" als eine der neuen Funktionen an, die C ++ 20 hinzugefügt wurden . In dem Artikel mit dem Titel Konsistenter Vergleich Sutter demonstrieren Maurer und Brown die Konzepte des neuen Designs. Für einen Überblick über den Vorschlag hier ein Auszug aus dem Artikel:
Der Ausdruck a <=> b gibt ein Objekt zurück, das <0 vergleicht, wenn a <b , > 0 vergleicht, wenn a> b , und == 0 vergleicht, wenn a und b gleich / äquivalent sind.
Häufiger Fall: Um alle Vergleiche für Ihren Typ X mit Typ Y mit Mitgliedssemantik zu schreiben, schreiben Sie einfach:
auto X::operator<=>(const Y&) =default;
Erweiterte Fälle: Um alle Vergleiche für Ihren Typ X mit Typ Y zu schreiben, schreiben Sie einfach den Operator <=> , der ein Y annimmt. Verwenden Sie
= default , um bei Bedarf eine Semantik auf Mitgliedsebene abzurufen, und geben Sie den entsprechenden Kategorietyp zurück:
- Geben Sie eine _ordering zurück, wenn Ihr Typ natürlich < unterstützt und wir effizient symmetrische < , > , <= , > = , == und
! = Generieren . Andernfalls geben Sie eine _Equality zurück , und wir generieren effizient symmetrische == und ! = .
- Geben Sie strong_ zurück, wenn für Ihren Typ a == b f (a) == f (b) impliziert (Substituierbarkeit, wobei f nur den Vergleichsstatus liest, auf den mit den öffentlichen const- Mitgliedern zugegriffen werden kann ), andernfalls geben Sie
schwach_ zurück .
Vergleichskategorien
Fünf Vergleichskategorien werden als std::
Typen definiert , die jeweils die folgenden vordefinierten Werte aufweisen:
+--------------------------------------------------------------------+
| | Numeric values | Non-numeric |
| Category +-----------------------------------+ |
| | -1 | 0 | +1 | values |
+------------------+------+------------+---------------+-------------+
| strong_ordering | less | equal | greater | |
| weak_ordering | less | equivalent | greater | |
| partial_ordering | less | equivalent | greater | unordered |
| strong_equality | | equal | nonequal | |
| weak_equality | | equivalent | nonequivalent | |
+------------------+------+------------+---------------+-------------+
Implizite Konvertierungen zwischen diesen Typen sind wie folgt definiert:
strong_ordering
mit Werten { less
, equal
, greater
} konvertiert implizit auf:
weak_ordering
mit Werten { less
, equivalent
, greater
}
partial_ordering
mit Werten { less
, equivalent
, greater
}
strong_equality
mit Werten { unequal
, equal
, unequal
}
weak_equality
mit Werten { nonequivalent
, equivalent
, nonequivalent
}
weak_ordering
mit Werten { less
, equivalent
, greater
} konvertiert implizit auf:
partial_ordering
mit Werten { less
, equivalent
, greater
}
weak_equality
mit Werten { nonequivalent
, equivalent
, nonequivalent
}
partial_ordering
mit Werten { less
, equivalent
, greater
, unordered
} konvertiert implizit auf:
weak_equality
mit Werten { nonequivalent
, equivalent
, nonequivalent
, nonequivalent
}
strong_equality
mit Werten { equal
, unequal
} wird implizit konvertiert in:
weak_equality
mit Werten { equivalent
, nonequivalent
}
Drei-Wege-Vergleich
Das <=>
Token wird eingeführt. Die Zeichenfolge wird im alten Quellcode mit einem <=>
Token versehen <= >
. Muss beispielsweise X<&Y::operator<=>
ein Leerzeichen hinzufügen, um seine Bedeutung beizubehalten.
Der überladbare Operator <=>
ist eine Drei-Wege-Vergleichsfunktion und hat Vorrang höher als <
und niedriger als <<
. Es gibt einen Typ zurück, der mit Literal verglichen werden kann, 0
aber andere Rückgabetypen sind zulässig, z. B. zur Unterstützung von Ausdrucksvorlagen. Alle <=>
in der Sprache und in der Standardbibliothek definierten Operatoren geben einen der 5 oben genannten std::
Vergleichskategorietypen zurück.
Für Sprachtypen werden die folgenden integrierten <=>
Vergleiche desselben Typs bereitgestellt. Alle sind constexpr , sofern nicht anders angegeben. Diese Vergleiche können nicht heterogen mit skalaren Promotions / Conversions aufgerufen werden.
- Für
bool
Integral- und Zeigertypen wird <=>
zurückgegeben strong_ordering
.
- Bei Zeigertypen können die verschiedenen CV-Qualifikationen und Konvertierungen von abgeleiteten zu Basis eine homogene integrierte Funktion aufrufen
<=>
, und es sind integrierte heterogene Funktionen vorhanden operator<=>(T*, nullptr_t)
. Nur Vergleiche von Zeigern auf dasselbe Objekt / dieselbe Zuordnung sind konstante Ausdrücke.
- Gibt für grundlegende Gleitkommatypen
<=>
zurück partial_ordering
und kann heterogen aufgerufen werden, indem Argumente auf einen größeren Gleitkommatyp erweitert werden.
- Gibt für Aufzählungen
<=>
dasselbe zurück wie die zugrunde liegenden Typen der Aufzählung <=>
.
- Für
nullptr_t
, <=>
kehrt strong_ordering
und immer Ausbeuten equal
.
- Gibt für kopierbare Arrays
T[N] <=> T[N]
den gleichen Typ wie T
's zurück <=>
und führt einen lexikografischen elementweisen Vergleich durch. Es gibt keine <=>
für andere Arrays.
- Denn
void
es gibt keine <=>
.
Zum besseren Verständnis der Funktionsweise von diesem Betreiber zu verstehen, benutzen Sie bitte das Original lesen Papier . Dies ist genau das, was ich mithilfe von Suchmaschinen herausgefunden habe.