<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 1319: Containers should require an iterator that is at least a Forward Iterator</title>
<meta property="og:title" content="Issue 1319: Containers should require an iterator that is at least a Forward Iterator">
<meta property="og:description" content="C++ library issue. Status: C++11">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue1319.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++11">C++11</a> status.</em></p>
<h3 id="1319"><a href="lwg-defects.html#1319">1319</a>. Containers should require an iterator that is at least a Forward Iterator</h3>
<p><b>Section:</b> 23.2.2 <a href="https://wg21.link/container.requirements.general">[container.requirements.general]</a> <b>Status:</b> <a href="lwg-active.html#C++11">C++11</a>
 <b>Submitter:</b> Alisdair Meredith <b>Opened:</b> 2010-02-16 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View other</b> <a href="lwg-index-open.html#container.requirements.general">active issues</a> in [container.requirements.general].</p>
<p><b>View all other</b> <a href="lwg-index.html#container.requirements.general">issues</a> in [container.requirements.general].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++11">C++11</a> status.</p>
<p><b>Discussion:</b></p>
<p>
The requirements on container iterators are spelled out in
23.2.2 <a href="https://wg21.link/container.requirements.general">[container.requirements.general]</a>, table 91.
</p>

<blockquote>
<table border="1">
<caption>Table 91 &mdash; Container requirements</caption>

<tr>
<th>Expression</th>
<th>Return type</th>
<th>Operational semantics</th>
<th>Assertion/note<br/>pre-/post-condition</th>
<th>Complexity</th>
</tr>

<tr>
<td colspan="5" align="center"><code>...</code></td>
</tr>

<tr>
<td><code>X::iterator</code></td>
<td>iterator type whose value type is <code>T</code></td>
<td></td>
<td>any iterator category except output iterator. Convertible to
<code>X::const_iterator</code>.</td>
<td>compile time</td>
</tr>

<tr>
<td><code>X::const_iterator</code></td>
<td>constant iterator type whose value type is <code>T</code></td>
<td></td>
<td>any iterator category except output iterator</td>
<td>compile time</td>
</tr>

<tr>
<td colspan="5" align="center"><code>...</code></td>
</tr>

</table>
</blockquote>

<p>
As input iterators do not have the multi-pass guarantee, they are not suitable
for iterating over a container.  For example, taking two calls to
<code>begin()</code>, incrementing either iterator might invalidate the other. 
While data structures might be imagined where this behaviour produces
interesting and useful results, it is very unlikely to meet the full set of
requirements for a standard container.
</p>

<p><i>[
Post-Rapperswil:
]</i></p>


<p>
Daniel notes: I changed the currently suggested P/R slightly, because it is not robust in regard to new fundamental iterator
catagories. I recommend to say instead that each container::iterator shall satisfy (and thus may refine) the forward 
iterator requirements.
</p>

<blockquote><p>
Moved to Tentatively Ready with revised wording after 5 positive votes on c++std-lib.
</p></blockquote>

<p><i>[
Adopted at 2010-11 Batavia
]</i></p>




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

<ol>
<li>Change Table 93 &mdash; Container requirements in [container.requirements.general] as indicated:
<blockquote>
<table border="1">
<caption>Table 93 &mdash; Container requirements</caption>

<tbody>
<tr>
<th>Expression</th>
<th>Return type</th>
<th>Operational<br/>semantics</th>
<th>Assertion&#47;note<br/>pre-&#47;post-condition</th>
<th>Complexity</th>
</tr>

<tr>
<td colspan="5" align="center"><code>...</code></td>
</tr>

<tr>
<td><code>X::iterator</code></td>
<td>iterator type<br/>whose value<br/>type is <code>T</code></td>
<td></td>
<td>any iterator category<br/><del>except output iterator</del><ins><br/>that 
meets the forward iterator requirements</ins>. convertible<br/>to<br/><code>X::const_iterator</code></td>
<td>compile time</td>
</tr>

<tr>
<td><code>X::const_iterator</code></td>
<td>constant iterator type<br/>whose value<br/>type is <code>T</code></td>
<td></td>
<td>any iterator category<br/><del>except output iterator</del><ins><br/>that 
meets the forward iterator requirements</ins>.</td>
<td>compile time</td>
</tr>

<tr>
<td colspan="5" align="center"><code>...</code></td>
</tr>

</tbody></table>
</blockquote>

</li>
</ol>






</body>
</html>
