<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2540: unordered_multimap::insert hint iterator</title>
<meta property="og:title" content="Issue 2540: unordered_multimap::insert hint iterator">
<meta property="og:description" content="C++ library issue. Status: C++17">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2540.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#C++17">C++17</a> status.</em></p>
<h3 id="2540"><a href="lwg-defects.html#2540">2540</a>. <code>unordered_multimap::insert</code> hint iterator</h3>
<p><b>Section:</b> 23.2.8 <a href="https://wg21.link/unord.req">[unord.req]</a> <b>Status:</b> <a href="lwg-active.html#C++17">C++17</a>
 <b>Submitter:</b> Isaac Hier <b>Opened:</b> 2015-09-16 <b>Last modified:</b> 2017-07-30</p>
<p><b>Priority: </b>3
</p>
<p><b>View other</b> <a href="lwg-index-open.html#unord.req">active issues</a> in [unord.req].</p>
<p><b>View all other</b> <a href="lwg-index.html#unord.req">issues</a> in [unord.req].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++17">C++17</a> status.</p>
<p><b>Discussion:</b></p>
<p>
I have been wondering about the C++ standard requirements regarding the hint iterator for insertion into an 
<code>unordered_multimap</code> (and I imagine a similar question could be asked of <code>unordered_map</code>, but 
I have not researched that topic). As far as I can tell, it seems perfectly valid for an implementation to 
allow only valid dereferencable iterators to be used as the hint argument for this member function. If that 
is correct, it means that one could not expect the end iterator to be used as a valid hint nor could one use 
the begin iterator of an empty <code>unordered_multimap</code> as the hint. However, this essentially precludes 
all uses of inserter on an empty <code>unordered_multimap</code> seeing as the inserter functor requires that a 
hint iterator be passed to its constructor.
<p/>
Howard Hinnant:
</p>
<blockquote class="note">
<p>
The intent of the standard is that the iterator produced from container <code>c</code> by <code>c.end()</code> is a 
valid (but non-dereferenceable) iterator into container <code>c</code>. It is reachable by every other iterator 
into <code>c</code>.
<p/>
It appears to me that you and the Bloomberg implementation have fallen victim to a type-o in the Unordered 
associative container requirements, Table 102.  The row containing:
</p>
<blockquote><pre>
a.insert(q, t);
</pre></blockquote>
<p>
should read instead:
</p>
<blockquote><pre>
a.insert(p, t);
</pre></blockquote>
<p>
The distinction is that <code>p</code> is valid, and <code>q</code> is both valid and dereferenceable.
The correction of this type-o would make unordered container <code>insert</code> consistent with unordered <code>emplace_hint</code>, 
associative <code>insert</code>, and associative <code>emplace_hint</code>.
</p>
</blockquote>

<p><i>[2016-08 - Chicago]</i></p>

<p>Thurs AM: Moved to Tentatively Ready</p>


<p id="res-2540"><b>Proposed resolution:</b></p>
<p>
Change the insert-with-hint row in Table 102
Unordered associative container requirements like so:
</p>
<blockquote>
<table border="1" cellpadding="4"><tr>
<td><code>a.insert(<del>q</del><ins>p</ins>, t);</code><br/></td>
<td><code>iterator</code><br/></td>
<td><i>Requires:</i> If <code>t</code> is a non-const<br/>...</td>
<td>Average Case<br/>...</td>
</tr></table>
</blockquote>





</body>
</html>
