<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 3415: back_insert_iterator fails when a container is also its value type</title>
<meta property="og:title" content="Issue 3415: back_insert_iterator fails when a container is also its value type">
<meta property="og:description" content="C++ library issue. Status: NAD">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue3415.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">NAD</a> status.</em></p>
<h3 id="3415"><a href="lwg-closed.html#3415">3415</a>. <code>back_insert_iterator</code> fails when a container is also its value type</h3>
<p><b>Section:</b> 24.5.2.2 <a href="https://wg21.link/back.insert.iterator">[back.insert.iterator]</a> <b>Status:</b> <a href="lwg-active.html#NAD">NAD</a>
 <b>Submitter:</b> Billy O'Neal III <b>Opened:</b> 2020-03-03 <b>Last modified:</b> 2020-07-17</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#back.insert.iterator">issues</a> in [back.insert.iterator].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#NAD">NAD</a> status.</p>
<p><b>Discussion:</b></p>
<p>
Consider the following:
</p>
<blockquote><pre>
#include &lt;algorithm&gt;
#include &lt;iterator&gt;
#include &lt;vector&gt;

struct example_container 
{
  using value_type = std::back_insert_iterator&lt;example_container&gt;;
  void push_back(const value_type&amp;) {}
};

int main() 
{
  std::vector&lt;std::back_insert_iterator&lt;example_container&gt;&gt; v;
  example_container ex;
  std::copy(v.begin(), v.end(), std::back_inserter(ex));
}
</pre></blockquote>
<p>
This example is out-of-contract in the current standard because it creates 
<code>back_insert_iterator&lt;<em>incomplete</em>&gt;</code>, as per 16.4.5.8 <a href="https://wg21.link/res.on.functions">[res.on.functions]</a>/2. 
However, it might be something we are considering for future iterators and proxy reference types. 
In practice, the "Ill-formed, no diagnostic required" the user is likely to get is an ambiguity between 
what <code>back_insert_iterator</code>'s copy assignment operator, and its "push back assigning operator". 
We could resolve this by changing the return type of <code>operator*</code> to a proxy in the same way 
<code>istream_iterator</code> does, though that might be ABI breaking for some implementations.
<p/>
We should consider having a standing LWG/LEWG policy that iterators are not their own proxy 
<code>operator*</code> type if we intend to leave the door open to more incomplete type support in 
the standard library.
</p>

<p><i>[2020-07-17; Status changed to NAD in telecon]</i></p>

<p>
We reviewed the reflector discussion and were not motivated to support this.
There were concerns that adding incomplete type support elsewhere in containers
has caused us regrettable problems, and we're not sure we could get this right
even if we wanted to support it.
</p>


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




</body>
</html>
