Date
2022-07-08.20:04:38
Message id
12566

Content

Proposed resolution:

This wording is relative to N4910.

  1. 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]