std::strong_order
| Definiert in der Header-Datei <compare> |
||
| inline namespace /* nicht spezifiziert */ { inline constexpr /* nicht spezifiziert */ strong_order = /* nicht spezifiziert */; |
(seit C++20) | |
| Aufruf-Signatur |
||
| template< class T, class U > requires /* siehe unten */ |
||
Vergleicht zwei Werte mittels 3-Wege-Vergleich und erzeugt ein Ergebnis vom Typ std::strong_ordering.
Seien t und u Ausdrücke und T und U bezeichnen decltype((t)) bzw. decltype((u)). Dann ist std::strong_order(t, u) ausdrucksäquivalent zu
- Wenn std::is_same_v<std::decay_t<T>, std::decay_t<U>> true ist
- std::strong_ordering(strong_order(t, u)), wenn dies ein wohlgeformter Ausdruck ist, bei dem die Überladungsauflösung in einem Kontext durchgeführt wird, der keine Deklaration von
std::strong_orderenthält, - andernfalls, wenn
Tein Fließkommatyp ist- Wenn std::numeric_limits<T>::is_iec559 true ist, wird der ISO/IEC/IEEE 60559 *totalOrder*-Vergleich von Fließkommawerten durchgeführt und dessen Ergebnis als Wert vom Typ std::strong_ordering zurückgegeben (Hinweis: Dieser Vergleich kann zwischen positivem und negativem Null und zwischen NaNs mit unterschiedlichen Darstellungen unterscheiden).
- andernfalls wird ein Wert vom Typ std::strong_ordering zurückgegeben, der konsistent mit der von den Vergleichsoperatoren von
Tbeobachteten Ordnung ist,
- andernfalls std::strong_ordering(std::compare_three_way()(t, u)), wenn dies wohlgeformt ist.
- std::strong_ordering(strong_order(t, u)), wenn dies ein wohlgeformter Ausdruck ist, bei dem die Überladungsauflösung in einem Kontext durchgeführt wird, der keine Deklaration von
- In allen anderen Fällen ist der Ausdruck ill-formed, was zu einem Substitutionsfehler führen kann, wenn er im unmittelbaren Kontext einer Template-Instanziierung auftritt.
Inhalt |
Customization Point Objects
Der Name std::strong_order bezeichnet ein Customization Point Object, ein konstantes Funktionsobjekt eines literalen semiregular Klassentyps. Zu Expositionszwecken wird die cv-unqualifizierte Version seines Typs als __strong_order_fn bezeichnet.
Alle Instanzen von __strong_order_fn sind gleich. Die Auswirkungen des Aufrufs verschiedener Instanzen vom Typ __strong_order_fn mit denselben Argumenten sind äquivalent, unabhängig davon, ob der die Instanz bezeichnende Ausdruck ein lvalue oder rvalue ist und ob er mit const qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Daher kann std::strong_order frei kopiert werden und seine Kopien können austauschbar verwendet werden.
Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die obigen Anforderungen an die Argumente von std::strong_order erfüllt, dann modelliert __strong_order_fn
- std::invocable<__strong_order_fn, Args...>,
- std::invocable<const __strong_order_fn, Args...>,
- std::invocable<__strong_order_fn&, Args...>, und
- std::invocable<const __strong_order_fn&, Args...>.
Andernfalls nimmt kein Funktionsaufrufoperator von __strong_order_fn an der Überladungsauflösung teil.
[bearbeiten] Strikte totale Ordnung von IEEE-Fließkommatypen
Seien x und y Werte desselben IEEE-Fließkommatyps und sei total_order_less(x, y) das boolesche Ergebnis, das angibt, ob x in der strikten totalen Ordnung, die durch *totalOrder* in ISO/IEC/IEEE 60559 definiert ist, vor y kommt.
(total_order_less(x, y) || total_order_less(y, x)) == false genau dann, wenn x und y dasselbe Bitmuster haben.
- Wenn weder x noch y NaN ist
- Wenn x < y, dann total_order_less(x, y) == true;
- Wenn x > y, dann total_order_less(x, y) == false;
- Wenn x == y,
- Wenn x die negative Null und y die positive Null ist, dann total_order_less(x, y) == true,
- Wenn x nicht Null ist und das Exponentenfeld von x kleiner ist als das von y, dann total_order_less(x, y) == (x > 0) (nur aussagekräftig für dezimale Fließkommazahlen);
- Wenn entweder x oder y NaN ist
- Wenn x die negative NaN und y nicht die negative NaN ist, dann total_order_less(x, y) == true,
- Wenn x nicht die positive NaN und y die positive NaN ist, dann total_order_less(x, y) == true,
- Wenn sowohl x als auch y NaNs mit demselben Vorzeichen sind und das Mantissenfeld von x kleiner ist als das von y, dann total_order_less(x, y) == !std::signbit(x).
[bearbeiten] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] Siehe auch
| (C++20) |
der Ergebnistyp des 3-Wege-Vergleichs, der alle 6 Operatoren unterstützt und substituierbar ist (Klasse) |
| (C++20) |
führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ std::weak_ordering(Customization Point Objekt) |
| (C++20) |
führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ std::partial_ordering(Customization Point Objekt) |
führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ std::strong_ordering, auch wenn operator<=> nicht verfügbar ist(Customization Point Objekt) |