Otherwise, if the operands have integral type,
the result is of type std::strong_ordering.
The result is
if both operands are arithmetically equal,
if the first operand is arithmetically
less than the second operand,
Otherwise, the operands have floating-point type, and
the result is of type std::partial_ordering.
The expression a <=> b yields
if a is less than b,
if a is greater than b,
if a is equivalent to b,
If the composite pointer type is
a function pointer type,
a pointer-to-member type, or
the result is of type std::strong_equality;
the result is
if the (possibly converted) operands compare equal ([expr.eq])
if they compare unequal,
otherwise the result of the operator is unspecified.
If the composite pointer type is an object pointer type,
p <=> q is of type std::strong_ordering.
If two pointer operands p and q compare equal ([expr.eq]),
p <=> q yields std::strong_ordering::equal;
if p and q compare unequal,
p <=> q yields
if q compares greater than p
if p compares greater than q ([expr.rel]).
The five comparison category types
are not predefined;
if the header
is not included prior to a use of such a class type –
even an implicit use in which the type is not named
(e.g., via the auto specifier
in a defaulted three-way comparison
or use of the built-in operator) – the program is ill-formed.