std::weak_order
| Definiert in der Header-Datei <compare> |
||
| inline namespace /* nicht spezifiziert */ { inline constexpr /* nicht spezifiziert */ weak_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::weak_ordering.
Seien t und u Ausdrücke und T bzw. U bezeichnen decltype((t)) und decltype(u)), so ist std::weak_order(t, u) ausdrucksäquivalent zu
- Wenn std::is_same_v<std::decay_t<T>, std::decay_t<U>> true ist
- std::weak_ordering(weak_order(t, u)), falls es sich um einen wohlgeformten Ausdruck handelt, wobei die Überladungsauflösung in einem Kontext durchgeführt wird, der keine Deklaration von
std::weak_ordereinschließt, - andernfalls, falls
Tein Gleitkommatyp ist- falls std::numeric_limits<T>::is_iec559 true ist, wird der schwache Ordnungsvergleich von Gleitkommawerten (siehe unten) durchgeführt und dieses Ergebnis als Wert vom Typ
std::weak_orderingzurückgegeben, - andernfalls wird ein Wert vom Typ
std::weak_orderinggeliefert, der konsistent mit der durch die Vergleichsoperatoren vonTbeobachteten Ordnung ist,
- falls std::numeric_limits<T>::is_iec559 true ist, wird der schwache Ordnungsvergleich von Gleitkommawerten (siehe unten) durchgeführt und dieses Ergebnis als Wert vom Typ
- andernfalls, std::weak_ordering(std::compare_three_way()(t, u)), falls dies wohlgeformt ist,
- andernfalls, std::weak_ordering(std::strong_order(t, u)), falls dies wohlgeformt ist.
- std::weak_ordering(weak_order(t, u)), falls es sich um einen wohlgeformten Ausdruck handelt, wobei 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::weak_order bezeichnet ein Customization Point Object, das ein const Funktionsobjekt eines literal semiregular-Klassentyps ist. Zu Auslegungszwecken wird die cv-unqualifizierte Version seines Typs als __weak_order_fn bezeichnet.
Alle Instanzen von __weak_order_fn sind gleich. Die Effekte des Aufrufs unterschiedlicher Instanzen vom Typ __weak_order_fn mit denselben Argumenten sind äquivalent, unabhängig davon, ob der Ausdruck, der die Instanz bezeichnet, ein lvalue oder rvalue ist, und ob er const-qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Daher kann std::weak_order frei kopiert werden und seine Kopien können austauschbar verwendet werden.
Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die Anforderungen für Argumente an std::weak_order oben erfüllen, dann modelliert __weak_order_fn
- std::invocable<__weak_order_fn, Args...>,
- std::invocable<const __weak_order_fn, Args...>,
- std::invocable<__weak_order_fn&, Args...>, und
- std::invocable<const __weak_order_fn&, Args...>.
Andernfalls nimmt kein operator() von __weak_order_fn an der Überladungsauflösung teil.
[bearbeiten] Strikte schwache Ordnung von IEEE-Gleitkommatypen
Seien x und y Werte desselben IEEE-Gleitkommatyps und weak_order_less(x, y) sei das boolesche Ergebnis, das angibt, ob x in der durch den C++-Standard definierten strikten schwachen Ordnung y vorangeht.
- Wenn weder x noch y NaN ist, dann ist weak_order_less(x, y) == true genau dann, wenn x < y ist, d.h. alle Darstellungen desselben Gleitkommawerts sind äquivalent;
- Wenn x negatives NaN und y kein negatives NaN ist, dann ist weak_order_less(x, y) == true;
- Wenn x kein positives NaN und y positives NaN ist, dann ist weak_order_less(x, y) == true;
- Wenn sowohl x als auch y NaNs mit demselben Vorzeichen sind, dann ist (weak_order_less(x, y) || weak_order_less(y, x)) == false, d.h. alle NaNs mit demselben Vorzeichen sind äquivalent.
[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 nicht substituierbar ist (Klasse) |
| (C++20) |
führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ std::strong_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) |
| (C++20) |
führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ std::weak_ordering, auch wenn operator<=> nicht verfügbar ist(Customization Point Objekt) |