In this subclause, BUILTIN-PTR-THREE-WAY(T, U)
for types T and U is a boolean constant expression.
BUILTIN-PTR-THREE-WAY(T, U) is true
if and only if <=> in the expression
declval<T>()<=> declval<U>()
resolves to a built-in operator comparing pointers.
struct compare_three_way {template<class T, class U>requires three_way_comparable_with<T, U>||BUILTIN-PTR-THREE-WAY(T, U)constexprautooperator()(T&& t, U&& u)const;
using is_transparent =unspecified;
};
Preconditions: If the expression std::forward<T>(t)<=> std::forward<U>(u) results in
a call to a built-in operator <=> comparing pointers of type P,
the conversion sequences from both T and U to P
are equality-preserving ([concepts.equality]).
If the expression std::forward<T>(t)<=> std::forward<U>(u) results in
a call to a built-in operator <=> comparing pointers of type P,
returns strong_ordering::less
if (the converted value of) t precedes u
in the implementation-defined strict total order
over pointers ([defns.order.ptr]),
strong_ordering::greater
if u precedes t, and
otherwise strong_ordering::equal.