Namensräume
Varianten
Aktionen

std::strong_order

Von cppreference.com
< cpp‎ | utility
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
strong_order
(C++20)
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
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 */

constexpr std::strong_ordering strong_order( T&& t, U&& u ) noexcept(/* 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_order enthält,
    • andernfalls, wenn T ein 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 T beobachteten Ordnung ist,
    • andernfalls std::strong_ordering(std::compare_three_way()(t, u)), wenn dies wohlgeformt ist.
  • 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

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

[bearbeiten] Siehe auch

der Ergebnistyp des 3-Wege-Vergleichs, der alle 6 Operatoren unterstützt und substituierbar ist
(Klasse) [edit]
führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ std::weak_ordering
(Customization Point Objekt)[edit]
führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ std::partial_ordering
(Customization Point Objekt)[edit]
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)[edit]