[comparisons.three.way] (original) (raw)
20 General utilities library [utilities]
20.14 Function objects [function.objects]
20.14.7 Comparisons [comparisons]
20.14.7.7 Class compare_three_way [comparisons.three.way]
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 trueif and only if <=> in the expression
declval() <=> declval()
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; };
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 Pare 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);