The direct base class subobjects of C,
in the order of their declaration in the base-specifier-list of C,
followed by the non-static data members of C,
in the order of their declaration in the member-specification of C,
form a list of subobjects.
In that list, any subobject of array type is recursively expanded
to the sequence of its elements, in the order of increasing subscript.
Let xi be an lvalue denoting the ith element
in the expanded list of subobjects for an object x
(of length n),
where xi is
formed by a sequence of
derived-to-base conversions ([over.best.ics]),
class member access expressions ([expr.ref]), and
array subscript expressions ([expr.sub]) applied to x.
The type of the expression xi<=>xi
is denoted by Ri.
It is unspecified
whether virtual base class subobjects are compared more than once.
If the declared return type
of a defaulted three-way comparison operator function
is auto,
then the return type is deduced as
the common comparison type (see below) of
R0, R1, …, Rn−1.
The return value V of type R
of the defaulted three-way comparison operator function
with parameters x and y of the same type
is determined by comparing corresponding elements
xi and yi
in the expanded lists of subobjects for x and y
until the first index i
where xi<=>yi
yields a result value vi where vi!=0,
contextually converted to bool, yields true;
V is vi converted to R.
If no such index exists, V is
std::strong_ordering::equal converted to R.
Otherwise, if
at least one Ti is std::weak_equality, or
at least one Ti is std::strong_equality and
at least one Tj is std::partial_ordering or
std::weak_ordering,
U is std::weak_equality ([cmp.weakeq]).