std:: weak_order
Defined in header
<compare>
|
||
inline
namespace
/* unspecified */
{
inline
constexpr
/* unspecified */
weak_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::weak_ordering
.
Let
t
and
u
be expressions and
T
and
U
denote
decltype
(
(
t
)
)
and
decltype
(
(
u
)
)
respectively,
std
::
weak_order
(
t, u
)
is
expression-equivalent
to:
-
If
std::
is_same_v
<
std::
decay_t
<
T
>
,
std::
decay_t
<
U
>>
is
true
:
-
std::
weak_ordering
(
weak_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::weak_order
, -
otherwise, if
T
is a floating-point type:-
if
std::
numeric_limits
<
T
>
::
is_iec559
is
true
, performs the weak ordering comparison of floating-point values (see below) and returns that result as a value of type
std::weak_ordering
, -
otherwise, yields a value of type
std::weak_ordering
that is consistent with the ordering observed byT
's comparison operators,
-
if
std::
numeric_limits
<
T
>
::
is_iec559
is
true
, performs the weak ordering comparison of floating-point values (see below) and returns that result as a value of type
- otherwise, std:: weak_ordering ( std:: compare_three_way ( ) ( t, u ) ) , if it is well-formed,
- otherwise, std:: weak_ordering ( std:: strong_order ( t, u ) ) , if it is well-formed.
-
std::
weak_ordering
(
weak_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::weak_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
__weak_order_fn
.
All instances of
__weak_order_fn
are equal. The effects of invoking different instances of type
__weak_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::weak_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::weak_order
above,
__weak_order_fn
models
- std:: invocable < __weak_order_fn, Args... > ,
- std:: invocable < const __weak_order_fn, Args... > ,
- std:: invocable < __weak_order_fn & , Args... > , and
-
std::
invocable
<
const
__weak_order_fn
&
, Args...
>
.
Otherwise, no function call operator of
__weak_order_fn
participates in overload resolution.
Strict weak order of IEEE floating-point types
Let x and y be values of same IEEE floating-point type, and weak_order_less ( x, y ) be the boolean result indicating if x precedes y in the strict weak order defined by the C++ standard.
- If neither x nor y is NaN, then weak_order_less ( x, y ) == true if and only if x < y , i.e. all representations of equal floating-point value are equivalent;
- If x is negative NaN and y is not negative NaN, then weak_order_less ( x, y ) == true ;
- If x is not positive NaN and y is positive NaN, then weak_order_less ( x, y ) == true ;
- If both x and y are NaNs with the same sign, then ( weak_order_less ( x, y ) || weak_order_less ( y, x ) ) == false , i.e. all NaNs with the same sign are equivalent.
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 not substitutable
(class) |
(C++20)
|
performs 3-way comparison and produces a result of type
std::strong_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::weak_ordering
, even if
operator
<=>
is unavailable
(customization point object) |