std:: strong_order
Defined in header
<compare>
|
||
inline
namespace
/* unspecified */
{
inline
constexpr
/* unspecified */
strong_order
=
/* unspecified */
;
|
(since C++20) | |
Call signature
|
||
template
<
class
T,
class
U
>
requires
/* see below */
|
||
Compares two values using 3-way comparison and produces a result of type
std::strong_ordering
.
Let
t
and
u
be expressions and
T
and
U
denote
decltype
(
(
t
)
)
and
decltype
(
(
u
)
)
respectively,
std
::
strong_order
(
t, u
)
is
expression-equivalent
to:
-
If
std::
is_same_v
<
std::
decay_t
<
T
>
,
std::
decay_t
<
U
>>
is
true
:
-
std::
strong_ordering
(
strong_order
(
t, u
)
)
, if it is a well-formed expression with overload resolution performed in a context that does not include a declaration of
std::strong_order
, -
otherwise, if
T
is a floating-point type:- if std:: numeric_limits < T > :: is_iec559 is true , performs the ISO/IEC/IEEE 60559 totalOrder comparison of floating-point values and returns that result as a value of type std::strong_ordering (note: this comparison can distinguish between the positive and negative zero and between the NaNs with different representations),
-
otherwise, yields a value of type
std::strong_ordering
that is consistent with the ordering observed by
T
's comparison operators,
- otherwise, std:: strong_ordering ( std:: compare_three_way ( ) ( t, u ) ) if it is well-formed.
-
std::
strong_ordering
(
strong_order
(
t, u
)
)
, if it is a well-formed expression with overload resolution performed in a context that does not include a declaration of
- In all other cases, the expression is ill-formed, which can result in substitution failure when it appears in the immediate context of a template instantiation.
Customization point objects
The name
std::strong_order
denotes a
customization point object
, which is a const
function object
of a
literal
semiregular
class type. For exposition purposes, the cv-unqualified version of its type is denoted as
__strong_order_fn
.
All instances of
__strong_order_fn
are equal. The effects of invoking different instances of type
__strong_order_fn
on the same arguments are equivalent, regardless of whether the expression denoting the instance is an lvalue or rvalue, and is const-qualified or not (however, a volatile-qualified instance is not required to be invocable). Thus,
std::strong_order
can be copied freely and its copies can be used interchangeably.
Given a set of types
Args...
, if
std::
declval
<
Args
>
(
)
...
meet the requirements for arguments to
std::strong_order
above,
__strong_order_fn
models
- std:: invocable < __strong_order_fn, Args... > ,
- std:: invocable < const __strong_order_fn, Args... > ,
- std:: invocable < __strong_order_fn & , Args... > , and
-
std::
invocable
<
const
__strong_order_fn
&
, Args...
>
.
Otherwise, no function call operator of
__strong_order_fn
participates in overload resolution.
Strict total order of IEEE floating-point types
Let x and y be values of same IEEE floating-point type, and total_order_less ( x, y ) be the boolean result indicating if x precedes y in the strict total order defined by totalOrder in ISO/IEC/IEEE 60559.
( total_order_less ( x, y ) || total_order_less ( y, x ) ) == false if and only if x and y have the same bit pattern.
-
if neither
x
nor
y
is NaN:
- if x < y , then total_order_less ( x, y ) == true ;
- if x > y , then total_order_less ( x, y ) == false ;
-
if
x
==
y
,
- if x is negative zero and y is positive zero, total_order_less ( x, y ) == true ,
- if x is not zero and x 's exponent field is less than y 's, then total_order_less ( x, y ) == ( x > 0 ) (only meaningful for decimal floating-point number);
-
if either
x
or
y
is NaN:
- if x is negative NaN and y is not negative NaN, then total_order_less ( x, y ) == true ,
- if x is not positive NaN and y is positive NaN, then total_order_less ( x, y ) == true ,
- if both x and y are NaNs with the same sign and x 's mantissa field is less than y 's, then total_order_less ( x, y ) == ! std:: signbit ( x ) .
Example
This section is incomplete
Reason: no example |
See also
(C++20)
|
the result type of 3-way comparison that supports all 6 operators and is substitutable
(class) |
(C++20)
|
performs 3-way comparison and produces a result of type
std::weak_ordering
(customization point object) |
(C++20)
|
performs 3-way comparison and produces a result of type
std::partial_ordering
(customization point object) |
(C++20)
|
performs 3-way comparison and produces a result of type
std::strong_ordering
, even if
operator
<=>
is unavailable
(customization point object) |