tuple
's comparison operatorsSection: 22.4.9 [tuple.rel] Status: NAD Concepts Submitter: Joe Gottman Opened: 2008-10-28 Last modified: 2016-01-28
Priority: Not Prioritized
View other active issues in [tuple.rel].
View all other issues in [tuple.rel].
View all issues with NAD Concepts status.
Discussion:
In the latest working draft for C++0x, tuple
's operator==
and operator<
are declared as
template<class... TTypes, class... UTypes> requires EqualityComparable<TTypes, UTypes>... bool operator==(const tuple<TTypes...>& t, const tuple<UTypes...>& u);
and
template<class... TTypes, class... UTypes> requires LessThanComparable<TTypes, UTypes>... bool operator<(const tuple<TTypes...>& t, const tuple<UTypes...>& u);
But the concepts EqualityComparable
and LessThanComparable
only take one
parameter, not two. Also, even if LessThanComparable
could take two
parameters, the definition of tuple::operator<()
should also require
LessThanComparable<UTypes, TTypes>... // (note the order)
since the algorithm for tuple::operator<
is the following (pseudo-code)
for (size_t N = 0; N < sizeof...(TTypes); ++N) { if (get<N>(t) < get<N>(u) return true; else if ((get<N>(u) < get<N>(t)) return false; } return false;
Similar problems hold for tuples
's other comparison operators.
[ Post Summit: ]
Recommend Tentatively Ready.
Proposed resolution:
In 22.4.1 [tuple.general] and 22.4.9 [tuple.rel] change:
template<class... TTypes, class... UTypes> requiresEqualityComparableHasEqualTo<TTypes, UTypes>... bool operator==(const tuple<TTypes...>&, const tuple<UTypes...>&); template<class... TTypes, class... UTypes> requiresLessThanComparableHasLess<TTypes, UTypes>... && HasLess<UTypes, TTypes>... bool operator<(const tuple<TTypes...>&, const tuple<UTypes...>&); template<class... TTypes, class... UTypes> requiresEqualityComparableHasEqualTo<TTypes, UTypes>... bool operator!=(const tuple<TTypes...>&, const tuple<UTypes...>&); template<class... TTypes, class... UTypes> requiresLessThanComparableHasLess<UTTypes,TUTypes>... && HasLess<UTypes, TTypes>... bool operator>(const tuple<TTypes...>&, const tuple<UTypes...>&); template<class... TTypes, class... UTypes> requiresLessThanComparableHasLess<UTTypes,TUTypes>... && HasLess<UTypes, TTypes>... bool operator<=(const tuple<TTypes...>&, const tuple<UTypes...>&); template<class... TTypes, class... UTypes> requiresLessThanComparableHasLess<TTypes, UTypes>... && HasLess<UTypes, TTypes>... bool operator>=(const tuple<TTypes...>&, const tuple<UTypes...>&);