<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 1167: pair&lt;T,U&gt; doesn't model LessThanComparable in unconstrained code even if
      T and U do.</title>
<meta property="og:title" content="Issue 1167: pair&lt;T,U&gt; doesn't model LessThanComparable in unconstrained code even if
      T and U do.">
<meta property="og:description" content="C++ library issue. Status: NAD Concepts">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue1167.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#NAD_Concepts">NAD Concepts</a> status.</em></p>
<h3 id="1167"><a href="lwg-closed.html#1167">1167</a>. <code>pair&lt;T,U&gt;</code> doesn't model <code>LessThanComparable</code> in unconstrained code even if
      <code>T</code> and <code>U</code> do.</h3>
<p><b>Section:</b> 22.3 <a href="https://wg21.link/pairs">[pairs]</a> <b>Status:</b> <a href="lwg-active.html#NAD_Concepts">NAD Concepts</a>
 <b>Submitter:</b> Dave Abrahams <b>Opened:</b> 2009-07-01 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#pairs">issues</a> in [pairs].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#NAD Concepts">NAD Concepts</a> status.</p>
<p><b>Discussion:</b></p>
<p>
<code>LessThanComparable</code> requires (and provides default
             implementations for) &lt;=,&gt;, and &gt;=.  However, the defaults
             don't take effect in unconstrained code.
</p>
<p>
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.
</p>
<p>
Totally Unbiased
Suggested Resolution:
</p>
<p>
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
</p>
<p>
e.g., remove from the body of <code>std::list</code>
</p>
<blockquote><pre>
template &lt;LessThanComparable T, class Allocator&gt; 
bool operator&lt; (const list&lt;T,Allocator&gt;&amp; x, const list&lt;T,Allocator&gt;&amp; y); 
template &lt;LessThanComparable T, class Allocator&gt; 
bool operator&gt; (const list&lt;T,Allocator&gt;&amp; x, const list&lt;T,Allocator&gt;&amp; y); 
template &lt;LessThanComparable T, class Allocator&gt; 
bool operator&gt;=(const list&lt;T,Allocator&gt;&amp; x, const list&lt;T,Allocator&gt;&amp; y); 
template &lt;LessThanComparable T, class Allocator&gt; 
bool operator&lt;=(const list&lt;T,Allocator&gt;&amp; x, const list&lt;T,Allocator&gt;&amp; y); 
</pre></blockquote>
<p>
and add this concept_map afterwards:
</p>
<blockquote><pre>
template &lt;LessThanComparable T, class Allocator&gt; 
export concept_map LessThanComparable&lt;list&lt;T,Allocator&gt; &gt;
{
    bool operator&lt;(const list&lt;T,Allocator&gt;&amp; x, const list&lt;T,Allocator&gt;&amp; y);
}
</pre></blockquote>
<p>
do similarly for <code>std::pair</code>.  While you're at it, do the same for
<code>operator==</code> and <code>!=</code> everywhere, and seek out other such opportunities.
</p>
<p>
Alternative Resolution: keep the ugly, complex specification and add the
                       missing operators to <code>std::pair</code>.
</p>


<p id="res-1167"><b>Proposed resolution:</b></p>





</body>
</html>
