Proposed resolution:
This wording is relative to N4910.
Modify [tuple.rel] as indicated:
template<class... TTypes, class... UTypes> constexpr common_comparison_category_t<synth-three-way-result<TTypes, UTypes>...> operator<=>(const tuple<TTypes...>& t, const tuple<UTypes...>& u);-4-
EffectsReturns: synth-three-way(get<i>(t), get<i>(u)) for the first i for which the result of that expression does not compare equal to 0. If no such i exists, strong_ordering::equal.Performs a lexicographical comparison between t and u. For any two zero-length tuples t and u, t <=> u returns strong_ordering::equal. Otherwise, equivalent to:if (auto c = synth-three-way(get<0>(t), get<0>(u)); c != 0) return c; return ttail <=> utail;
where rtail for some tuple r is a tuple containing all but the first element of r.-?- Remarks: The elementary synth-three-way(get<i>(t), get<i>(u)) expressions are evaluated in order from the zeroth index upwards. No element accesses are performed after the first invocation that results in a value that does not compare equal to 0.
-5- [Note 1: The above definition does not require ttail (or utail) to be constructed. It might not even be possible, as t and u are not required to be copy constructible. Also, all comparison operator functions are short circuited; they do not perform element accesses beyond what is required to determine the result of the comparison. — end note]