std::compare_three_way
Defined in header <compare> | ||
---|---|---|
Defined in header <functional> | ||
struct compare_three_way; | (since C++20) |
Function object for performing comparisons. Deduces the parameter types and the return type of the function call operator.
Nested types
Nested type | Definition |
---|---|
is_transparent | unspecified |
Member functions
operator() | obtains the result of three-way comparison on both arguments (public member function) |
std::compare_three_way::operator()
template< class T, class U > constexpr auto operator()( T&& t, U&& u ) const; |
Given the expression std::forward<T>(t) <=> std::forward<U>(u)
as expr
:
- If
expr
results in a call to built-in operator<=> comparing pointers, given the composite pointer type oft
andu
asP
: - Compares the two converted pointers (of type
P
) in the implementation-defined strict total order over pointers: - If
t
precedesu
, returnsstd::strong_ordering::less
. - If
u
precedest
, returnsstd::strong_ordering::greater
. - Otherwise, returns
std::strong_ordering::equal
. - If the conversion sequence from
T
toP
or the conversion sequence fromU
toP
is not equality-preserving, the behavior is undefined. - Otherwise:
- Returns the result of
expr
. - If
std::three_way_comparable_with<T, U>
is not modeled, the behavior is undefined.
This overload participates in overload resolution only if std::three_way_comparable_with<T, U>
is satisfied.
Example
#include <compare> #include <iostream> struct Rational { int num; int den; // > 0 // Although the comparison X <=> Y will work, a direct call // to std::compare_three_way{}(X, Y) requires the operator== // be defined, to satisfy the std::three_way_comparable_with. constexpr bool operator==(Rational const&) const = default; }; constexpr std::weak_ordering operator<=>(Rational lhs, Rational rhs) { return lhs.num * rhs.den <=> rhs.num * lhs.den; } void print(std::weak_ordering value) { value < 0 ? std::cout << "less\n" : value > 0 ? std::cout << "greater\n" : std::cout << "equal\n"; } int main() { Rational a{6, 5}; Rational b{8, 7}; print(a <=> b); print(std::compare_three_way{}(a, b)); }
Output:
greater greater
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3530 | C++20 | syntactic checks were relaxed while comparing pointers | only semantic requirements are relaxed |
See also
(C++20) | function object implementing x == y (class) |
(C++20) | function object implementing x != y (class) |
(C++20) | function object implementing x < y (class) |
(C++20) | function object implementing x > y (class) |
(C++20) | function object implementing x <= y (class) |
(C++20) | function object implementing x >= y (class) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/compare/compare_three_way