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) constexpr auto operator()(T&& t, U&& u) const; using is_transparent = unspecified; };

In addition to being available via inclusion of the <compare> header,
the class compare_three_way is available
when the header <functional> ([functional.syn]) is included.

```
template<class T, class U>
requires three_way_comparable_with<T, U> || BUILTIN-PTR-THREE-WAY(T, U)
constexpr auto operator()(T&& t, U&& u) const;
```

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]).

Effects:

- 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.
- Otherwise, equivalent to: return std::forward<T>(t) <=> std::forward<U>(u);