|
|
Defined in header <compare> | ||
inlinenamespace/* unspecified */{ inlineconstexpr/* unspecified */ | (since C++20) | |
Call signature | ||
template<class T,class U> requires/* see below */ | (since C++20) | |
Performs three-way comparison onsubexpressionst andu and produces a result of typestd::weak_ordering, even if the operator<=>
is unavailable.
Ifstd::decay_t<T> andstd::decay_t<U> are the same type,std::compare_weak_order_fallback(t, u) isexpression-equivalent to:
In all other cases,std::compare_weak_order_fallback(t, u) is ill-formed, which can result insubstitution failure when it appears in the immediate context of a template instantiation.
Contents |
The namestd::compare_weak_order_fallback
denotes acustomization point object, which is a constfunction object of aliteralsemiregular
class type. SeeCustomizationPointObject for details.
#include <compare>#include <iostream> // does not support <=>struct Rational_1{int num;int den;// > 0}; inlineconstexprbool operator<(Rational_1 lhs, Rational_1 rhs){return lhs.num* rhs.den< rhs.num* lhs.den;} inlineconstexprbool operator==(Rational_1 lhs, Rational_1 rhs){return lhs.num* rhs.den== rhs.num* lhs.den;} // supports <=>struct Rational_2{int num;int den;// > 0}; inlineconstexprstd::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs){return lhs.num* rhs.den<=> rhs.num* lhs.den;} inlineconstexprbool operator==(Rational_2 lhs, Rational_2 rhs){return lhs<=> rhs==0;} void print(int id,std::weak_ordering value){std::cout<< id<<") ";if(value==0)std::cout<<"equal\n";elseif(value<0)std::cout<<"less\n";elsestd::cout<<"greater\n";} int main(){ Rational_1 a{1,2}, b{3,4};// print(0, a <=> b); // does not work print(1, std::compare_weak_order_fallback(a, b));// works, defaults to < and == Rational_2 c{6,5}, d{8,7}; print(2, c<=> d);// works print(3, std::compare_weak_order_fallback(c, d));// works Rational_2 e{2,3}, f{4,6}; print(4, e<=> f);// works print(5, std::compare_weak_order_fallback(e, f));// works}
Output:
1) less2) greater3) greater4) equal5) equal
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 2114 (P2167R3) | C++20 | the fallback mechanism only required return types to be convertible tobool | constraints strengthened |
(C++20) | performs 3-way comparison and produces a result of typestd::weak_ordering (customization point object)[edit] |