11 Classes [class]

11.11 Comparisons [class.compare]

11.11.3 Three-way comparison [class.spaceship]

The synthesized three-way comparison for comparison category type R ([cmp.categories]) of glvalues a and b of the same type is defined as follows:
Note
:
A synthesized three-way comparison may be ill-formed if overload resolution finds usable functions that do not otherwise meet the requirements implied by the defined expression.
— end note
 ]
Given an expanded list of subobjects for an object x of type C, the type of the expression <=> is denoted by .
If overload resolution as applied to <=> does not find a usable function, then is void.
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 , , , .
If the return type is deduced as void, the operator function is defined as deleted.
If the declared return type of a defaulted three-way comparison operator function is R and the synthesized three-way comparison for comparison category type R between any objects and is not defined or would be ill-formed, the operator function is defined as deleted.
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 and in the expanded lists of subobjects for x and y (in increasing index order) until the first index i where the synthesized three-way comparison for comparison category type R between and yields a result value where , contextually converted to bool, yields true; V is .
If no such index exists, V is std​::​strong_­ordering​::​equal converted to R.
The common comparison type U of a possibly-empty list of n types , , , is defined as follows: