|
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Old binders and adaptors | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
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.
Contents |
Nested type | Definition |
is_transparent | unspecified |
operator() | obtains the result of three-way comparison on both arguments (public member function) |
template<class T,class U> constexprauto operator()( T&& t, U&& u)const; | ||
Given the expressionstd::forward<T>(t)<=>std::forward<U>(u) asexpr:
P
:P
) in theimplementation-defined strict total order over pointers:T
toP
or the conversion sequence fromU
toP
is notequality-preserving, the behavior is undefined.This overload participates in overload resolution only ifstd::three_way_comparable_with<T, U> is satisfied.
#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.constexprbool operator==(Rationalconst&)const=default;}; constexprstd::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:
greatergreater
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 |
(C++20) | constrained function object implementingx== y (class)[edit] |
(C++20) | constrained function object implementingx!= y (class)[edit] |
(C++20) | constrained function object implementingx< y (class)[edit] |
(C++20) | constrained function object implementingx> y (class)[edit] |
(C++20) | constrained function object implementingx<= y (class)[edit] |
(C++20) | constrained function object implementingx>= y (class)[edit] |