std::strong_order
| Definiert in Header <compare>
|
||
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ strong_order = /* unspecified */;
}
|
(seit C++20) | |
| Aufrufsignatur |
||
template< class T, class U >
requires /* see below */
constexpr std::strong_ordering strong_order( T&& t, U&& u ) noexcept(/* see below */);
|
||
Vergleicht zwei Werte mittels Drei-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:
- Falls
std::is_same_v<std::decay_t<T>, std::decay_t<U>>trueist:std::strong_ordering(strong_order(t, u)), falls es ein wohlgeformter Ausdruck ist, wobei die Überladungsauflösung in einem Kontext durchgeführt wird, der keine Deklaration vonstd::strong_orderenthält,- andernfalls, falls
Tein Gleitkommatyp ist:- falls
std::numeric_limits<T>::is_iec559trueist, wird der ISO/IEC/IEEE 60559 totalOrder-Vergleich von Gleitkommawerten durchgeführt und das Ergebnis als Wert vom Typ std::strong_ordering zurückgegeben (Hinweis: Dieser Vergleich kann zwischen positiver und negativer Null sowie zwischen NaN mit verschiedenen Darstellungen unterscheiden), - andernfalls wird ein Wert vom Typ std::strong_ordering geliefert, der mit der durch
Ts Vergleichsoperatoren beobachteten Ordnung konsistent ist,
- falls
- andernfalls
std::strong_ordering(std::compare_three_way()(t, u)), falls dies wohlgeformt ist.
- In allen anderen Fällen ist der Ausdruck fehlerhaft, was zu Substitutionsfehler führen kann, wenn er im unmittelbaren Kontext einer Template-Instantiierung auftritt.
Customization Point Objects
Der Name
std::strong_order
bezeichnet ein
Customization Point Object
, welches ein konstantes
Funktionsobjekt
eines
literalen
semiregular
Klassentyps ist. Weitere Details finden Sie unter
CustomizationPointObject
.
Strikte Totalordnung von IEEE-Gleitkommatypen
Seien x und y Werte desselben IEEE-Gleitkommatyps, und total_order_less ( x, y ) sei das boolesche Ergebnis, das angibt, ob x in der strengen Totalordnung, 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 negative Null und y positive Null ist, total_order_less ( x, y ) == true ,
- wenn x nicht Null ist und x 's Exponentenfeld kleiner als y 's ist, dann total_order_less ( x, y ) == ( x > 0 ) (nur bedeutsam für dezimale Gleitkommazahlen);
-
wenn entweder
x
oder
y
NaN ist:
- wenn x negatives NaN und y nicht negatives NaN ist, dann total_order_less ( x, y ) == true ,
- wenn x nicht positives NaN und y positives NaN ist, dann total_order_less ( x, y ) == true ,
- wenn sowohl x als auch y NaNs mit gleichem Vorzeichen sind und x 's Mantissenfeld kleiner als y 's ist, dann total_order_less ( x, y ) == ! std:: signbit ( x ) .
Beispiel
|
Dieser Abschnitt ist unvollständig
Grund: Kein Beispiel |
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
(Anpassungspunktobjekt) |
|
(C++20)
|
Führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ
std::partial_ordering
(Anpassungspunktobjekt) |
|
(C++20)
|
Führt einen 3-Wege-Vergleich durch und erzeugt ein Ergebnis vom Typ
std::strong_ordering
, selbst wenn
operator
<=>
nicht verfügbar ist
(Anpassungspunktobjekt) |