GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::compare_weak_order_fallback(3) C++ Standard Libary std::compare_weak_order_fallback(3)

std::compare_weak_order_fallback - std::compare_weak_order_fallback


Defined in header <compare>
inline namespace /* unspecified */ {


inline constexpr /* unspecified */ (since C++20)
compare_weak_order_fallback = /* unspecified */;


}
Call signature
template< class T, class U >


requires /* see below */
constexpr std::weak_ordering


compare_weak_order_fallback(T&& t, U&& u) noexcept(/* see below */);


Performs three-way comparison on t and u and produces a result of type
std::weak_ordering, even if the operator <=> is unavailable.


Let t and u be expressions and T and U denote decltype((t)) and decltype((u))
respectively, std::compare_weak_order_fallback(t, u) is expression-equivalent to:


* If std::is_same_v<std::decay_t<T>, std::decay_t<U>> is true:


* std::weak_order(t, u), if it is a well-formed expression;
* otherwise,


t == u ? std::weak_ordering::equivalent :
t < u ? std::weak_ordering::less :
std::weak_ordering::greater


if t == u and t < u are both well-formed and convertible to
bool, except that t and u are evaluated only once.


* In all other cases, std::compare_weak_order_fallback(t, u) is ill-formed, which
can result in substitution failure when it appears in the immediate context of a
template instantiation.


Expression-equivalent


Expression e is expression-equivalent to expression f, if


* e and f have the same effects, and
* either both are constant subexpressions or else neither is a constant
subexpression, and
* either both are potentially-throwing or else neither is potentially-throwing
(i.e. noexcept(e) == noexcept(f)).


Customization point objects


The name std::compare_weak_order_fallback 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
__compare_weak_order_fallback_fn.


All instances of __compare_weak_order_fallback_fn are equal. The effects of invoking
different instances of type __compare_weak_order_fallback_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::compare_weak_order_fallback
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::compare_weak_order_fallback above,
__compare_weak_order_fallback_fn models


* std::invocable<__compare_weak_order_fallback_fn, Args...>,
* std::invocable<const __compare_weak_order_fallback_fn, Args...>,
* std::invocable<__compare_weak_order_fallback_fn&, Args...>, and
* std::invocable<const __compare_weak_order_fallback_fn&, Args...>.


Otherwise, no function call operator of __compare_weak_order_fallback_fn
participates in overload resolution.

// Run this code


#include <iostream>
#include <compare>


// does not support <=>
struct Rational_1 {
int num;
int den; // > 0
};


inline constexpr bool operator<(Rational_1 lhs, Rational_1 rhs)
{
return lhs.num * rhs.den < rhs.num * lhs.den;
}


inline constexpr bool 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


bool operator==(Rational_2 const&) const = default;
};


inline constexpr std::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs)
{
return lhs.num * rhs.den <=> rhs.num * lhs.den;
}


void print(std::weak_ordering value)
{
if (value == 0)
std::cout << "equal\n";
else if (value < 0)
std::cout << "less\n";
else
std::cout << "greater\n";
}


int main()
{
Rational_1 a{1, 2};
Rational_1 b{3, 4};
// print(a <=> b); // doesn't work
print(std::compare_weak_order_fallback(a, b)); // works, defaults to < and ==


Rational_2 c{6, 5};
Rational_2 d{8, 7};
print(c <=> d); // works
print(std::compare_weak_order_fallback(c, d)); // works
}


less
greater
greater


weak_order performs 3-way comparison and produces a result of type
(C++20) std::weak_ordering
(customization point object)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.