This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of NAD Concepts status.
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: