std::strong_ordering
| Definiert in der Header-Datei <compare> |
||
| class strong_ordering; |
(seit C++20) | |
Der Klassentyp std::strong_ordering ist der Ergebnistyp eines Drei-Wege-Vergleichs, der
- alle sechs relationalen Operatoren (
==,!=,<,<=,>,>=) zulässt.
- Substituierbarkeit impliziert: Wenn a äquivalent zu b ist, dann ist auch f(a) äquivalent zu f(b), wobei f eine Funktion bezeichnet, die nur vergleichsrelevante Zustände liest, die über die öffentlichen const-Member des Arguments zugänglich sind. Anders ausgedrückt, äquivalente Werte sind ununterscheidbar.
- Lässt keine unvergleichbaren Werte zu: Genau einer der Ausdrücke a < b, a == b oder a > b muss true sein.
Inhalt |
[edit] Konstanten
Der Typ std::strong_ordering hat vier gültige Werte, die als const static Datenmember seines Typs implementiert sind.
| Name | Definition |
| inline constexpr std::strong_ordering less [static] |
ein gültiger Wert, der eine Kleiner-als-Beziehung (geordnet davor) angibt (öffentliche statische Member-Konstante) |
| inline constexpr std::strong_ordering equivalent [static] |
ein gültiger Wert, der Äquivalenz (weder davor noch danach geordnet) angibt, dasselbe wie equal(öffentliche statische Member-Konstante) |
| inline constexpr std::strong_ordering equal [static] |
ein gültiger Wert, der Äquivalenz (weder davor noch danach geordnet) angibt, dasselbe wie equivalent(öffentliche statische Member-Konstante) |
| inline constexpr std::strong_ordering greater [static] |
ein gültiger Wert, der eine Größer-als-Beziehung (geordnet danach) angibt (öffentliche statische Member-Konstante) |
[edit] Konvertierungen
std::strong_ordering ist die stärkste der drei Vergleichskategorien: Es ist nicht implizit von anderen Kategorien konvertierbar und implizit in die anderen beiden konvertierbar.
| operator partial_ordering |
implizite Konvertierung zu std::partial_ordering (öffentliche Memberfunktion) |
std::strong_ordering::operator partial_ordering
| constexpr operator partial_ordering() const noexcept; |
||
Rückgabewert
std::partial_ordering::less, wenn v less ist, std::partial_ordering::greater, wenn v greater ist, std::partial_ordering::equivalent, wenn v equal oder equivalent ist.
| operator weak_ordering |
implizite Konvertierung zu std::weak_ordering (öffentliche Memberfunktion) |
std::strong_ordering::operator weak_ordering
| constexpr operator weak_ordering() const noexcept; |
||
Rückgabewert
std::weak_ordering::less, wenn v less ist, std::weak_ordering::greater, wenn v greater ist, std::weak_ordering::equivalent, wenn v equal oder equivalent ist.
[edit] Vergleiche
Vergleichsoperatoren sind zwischen Werten dieses Typs und dem Literal 0 definiert. Dies unterstützt die Ausdrücke a <=> b == 0 oder a <=> b < 0, die verwendet werden können, um das Ergebnis eines Drei-Wege-Vergleichsoperators in eine boolesche Beziehung umzuwandeln; siehe std::is_eq, std::is_lt usw.
Diese Funktionen sind für die normale unqualifizierte oder qualifizierte Suche nicht sichtbar und können nur durch argumentabhängige Suche gefunden werden, wenn std::strong_ordering eine assoziierte Klasse der Argumente ist.
Das Verhalten eines Programms, das versucht, ein strong_ordering mit etwas anderem als dem ganzzahligen Literal 0 zu vergleichen, ist undefiniert.
| operator==operator<operator>operator<=operator>=operator<=> |
Vergleich mit Null oder einem strong_ordering(Funktion) |
operator==
| friend constexpr bool operator==( strong_ordering v, /*nicht spezifiziert*/ u ) noexcept; |
(1) | |
| friend constexpr bool operator==( strong_ordering v, strong_ordering w ) noexcept = default; |
(2) | |
Parameter
| v, w | - | std::strong_ordering-Werte zum Überprüfen |
| u | - | ein unbenutzter Parameter beliebigen Typs, der ein Literal-Null-Argument akzeptiert |
Rückgabewert
v equivalent oder equal ist, false, wenn v less oder greater istequal dasselbe ist wie equivalent.operator<
| friend constexpr bool operator<( strong_ordering v, /*nicht spezifiziert*/ u ) noexcept; |
(1) | |
| friend constexpr bool operator<( /*nicht spezifiziert*/ u, strong_ordering v ) noexcept; |
(2) | |
Parameter
| v | - | ein std::strong_ordering-Wert zum Überprüfen |
| u | - | ein unbenutzter Parameter beliebigen Typs, der ein Literal-Null-Argument akzeptiert |
Rückgabewert
v less ist, und false, wenn v greater, equivalent oder equal istv greater ist, und false, wenn v less, equivalent oder equal istoperator<=
| friend constexpr bool operator<=( strong_ordering v, /*nicht spezifiziert*/ u ) noexcept; |
(1) | |
| friend constexpr bool operator<=( /*nicht spezifiziert*/ u, strong_ordering v ) noexcept; |
(2) | |
Parameter
| v | - | ein std::strong_ordering-Wert zum Überprüfen |
| u | - | ein unbenutzter Parameter beliebigen Typs, der ein Literal-Null-Argument akzeptiert |
Rückgabewert
v less, equivalent oder equal ist, und false, wenn v greater istv greater, equivalent oder equal ist, und false, wenn v less istoperator>
| friend constexpr bool operator>( strong_ordering v, /*nicht spezifiziert*/ u ) noexcept; |
(1) | |
| friend constexpr bool operator>( /*nicht spezifiziert*/ u, strong_ordering v ) noexcept; |
(2) | |
Parameter
| v | - | ein std::strong_ordering-Wert zum Überprüfen |
| u | - | ein unbenutzter Parameter beliebigen Typs, der ein Literal-Null-Argument akzeptiert |
Rückgabewert
v greater ist, und false, wenn v less, equivalent oder equal istv less ist, und false, wenn v greater, equivalent oder equal istoperator>=
| friend constexpr bool operator>=( strong_ordering v, /*nicht spezifiziert*/ u ) noexcept; |
(1) | |
| friend constexpr bool operator>=( /*nicht spezifiziert*/ u, strong_ordering v ) noexcept; |
(2) | |
Parameter
| v | - | ein std::strong_ordering-Wert zum Überprüfen |
| u | - | ein unbenutzter Parameter beliebigen Typs, der ein Literal-Null-Argument akzeptiert |
Rückgabewert
v greater, equivalent oder equal ist, und false, wenn v less istv less, equivalent oder equal ist, und false, wenn v greater istoperator<=>
| friend constexpr strong_ordering operator<=>( strong_ordering v, /*nicht spezifiziert*/ u ) noexcept; |
(1) | |
| friend constexpr strong_ordering operator<=>( /*nicht spezifiziert*/ u, strong_ordering v ) noexcept; |
(2) | |
Parameter
| v | - | ein std::strong_ordering-Wert zum Überprüfen |
| u | - | ein unbenutzter Parameter beliebigen Typs, der ein Literal-Null-Argument akzeptiert |
Rückgabewert
greater, wenn v less ist, less, wenn v greater ist, andernfalls v.[edit] Beispiel
#include <compare> #include <iostream> struct Point { int x{}, y{}; friend constexpr std::strong_ordering operator<=>(Point lhs, Point rhs) { if (lhs.x < rhs.x or (lhs.x == rhs.x and lhs.y < rhs.y)) return std::strong_ordering::less; if (lhs.x > rhs.x or (lhs.x == rhs.x and lhs.y > rhs.y)) return std::strong_ordering::greater; return std::strong_ordering::equivalent; } friend std::ostream& operator<<(std::ostream& os, Point s) { return os << '(' << s.x << ',' << s.y << ')'; } }; void print_three_way_comparison(const auto& p, const auto& q) { const auto cmp{p <=> q}; std::cout << p << (cmp < 0 ? " < " : cmp > 0 ? " > " : " == " ) // compares with 0 << q << '\n'; } void print_two_way_comparison(const auto& p, const auto& q) { std::cout << p << (p < q ? " < " : p > q ? " > " : " == ") // compares p and q << q << '\n'; } int main() { const Point p1{0, 1}, p2{0, 1}, p3{0, 2}; print_three_way_comparison(p1, p2); print_two_way_comparison(p1, p2); print_three_way_comparison(p2, p3); print_two_way_comparison(p2, p3); print_three_way_comparison(p3, p2); print_two_way_comparison(p3, p2); }
Ausgabe
(0,1) == (0,1) (0,1) == (0,1) (0,1) < (0,2) (0,1) < (0,2) (0,2) > (0,1) (0,2) > (0,1)
[edit] Siehe auch
| (C++20) |
der Ergebnistyp des 3-Wege-Vergleichs, der alle 6 Operatoren unterstützt und nicht substituierbar ist (Klasse) |
| (C++20) |
der Ergebnistyp des 3-Wege-Vergleichs, der alle 6 Operatoren unterstützt, nicht substituierbar ist und unvergleichbare Werte zulässt (Klasse) |