pair<T,U>
doesn't model LessThanComparable
in unconstrained code even if
T
and U
do.Section: 22.3 [pairs] Status: NAD Concepts Submitter: Dave Abrahams Opened: 2009-07-01 Last modified: 2016-01-28
Priority: Not Prioritized
View all other issues in [pairs].
View all issues with NAD Concepts status.
Discussion:
LessThanComparable
requires (and provides default
implementations for) <=,>, and >=. However, the defaults
don't take effect in unconstrained code.
Still, it's a problem to have types acting one way in constrained code and another in unconstrained code, except in cases of syntax adaptation. It's also inconsistent with the containers, which supply all those operators.
Totally Unbiased Suggested Resolution:
accept the exported concept maps proposal and change the way this stuff is handled to use an explicit exported concept map rather than nested function templates
e.g., remove from the body of std::list
template <LessThanComparable T, class Allocator> bool operator< (const list<T,Allocator>& x, const list<T,Allocator>& y); template <LessThanComparable T, class Allocator> bool operator> (const list<T,Allocator>& x, const list<T,Allocator>& y); template <LessThanComparable T, class Allocator> bool operator>=(const list<T,Allocator>& x, const list<T,Allocator>& y); template <LessThanComparable T, class Allocator> bool operator<=(const list<T,Allocator>& x, const list<T,Allocator>& y);
and add this concept_map afterwards:
template <LessThanComparable T, class Allocator> export concept_map LessThanComparable<list<T,Allocator> > { bool operator<(const list<T,Allocator>& x, const list<T,Allocator>& y); }
do similarly for std::pair
. While you're at it, do the same for
operator==
and !=
everywhere, and seek out other such opportunities.
Alternative Resolution: keep the ugly, complex specification and add the
missing operators to std::pair
.
Proposed resolution: