<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2261: Are containers required to use their 'pointer' type internally?</title>
<meta property="og:title" content="Issue 2261: Are containers required to use their 'pointer' type internally?">
<meta property="og:description" content="C++ library issue. Status: C++17">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2261.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="2261"><a href="lwg-defects.html#2261">2261</a>. Are containers required to use their '<code>pointer</code>' type internally?</h3>
<p><b>Section:</b> 23.2 <a href="https://wg21.link/container.requirements">[container.requirements]</a> <b>Status:</b> <a href="lwg-active.html#C++17">C++17</a>
 <b>Submitter:</b> Jonathan Wakely <b>Opened:</b> 2013-05-14 <b>Last modified:</b> 2017-07-30</p>
<p><b>Priority: </b>2
</p>
<p><b>View all other</b> <a href="lwg-index.html#container.requirements">issues</a> in [container.requirements].</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>
Is a container <code>C</code> only supposed to refer to allocated memory (blocks of
contiguous storage, nodes, etc.) through objects of type <code>C::pointer</code>
rather than <code>C::value_type*</code>?
</p>

<p>
I don't see anything explicitly requiring this, so a container could
immediately convert the result of <code>get_allocator().allocate(1)</code> to a
built-in pointer of type <code>value_type*</code> and only deal with the built-in
pointer until it needs to deallocate it again, but that removes most
of the benefit of allowing allocators to use custom pointer types.
</p>

<p><i>[2014-06-12, Jonathan comments]</i></p>

<p>
This issue is basically the same issue as LWG <a href="lwg-active.html#1521" title="Requirements on internal pointer representations in containers (Status: Open)">1521</a><sup><a href="https://cplusplus.github.io/LWG/issue1521" title="Latest snapshot">(i)</a></sup>, which agrees it's an issue, 
to be dealt with in the future, so I request that <a href="lwg-defects.html#2261" title="Are containers required to use their 'pointer' type internally? (Status: C++17)">2261</a><sup><a href="https://cplusplus.github.io/LWG/issue2261" title="Latest snapshot">(i)</a></sup> not be closed as a dup 
unless we reopen <a href="lwg-active.html#1521" title="Requirements on internal pointer representations in containers (Status: Open)">1521</a><sup><a href="https://cplusplus.github.io/LWG/issue1521" title="Latest snapshot">(i)</a></sup>.
</p>

<p><i>[2016-08, Zhihao comments]</i></p>

<p>The <code>pointer</code> types are not exposed in the container interface,
and we consider that the memory allocation constraints
"all containers defined in this clause obtain memory using an
allocator" already implies the reasonable expectation.  We
propose the fix as non-normative.
</p>

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

<p>Tues PM: General agreement on direction, Alisdair and Billy to update wording</p>
<p>Fri AM: Moved to Tentatively Ready</p>


<p id="res-2261"><b>Proposed resolution:</b></p>
<p>This wording is relative to N4606.</p>

<p><i>[Drafting notes: if people prefer this to be normative, strip
the "Note" markups.]</i></p>


<p>Modify 23.2.2 <a href="https://wg21.link/container.requirements.general">[container.requirements.general]</a>/8 as indicated:</p>

<blockquote><p>
Unless otherwise specified, all containers defined in this clause obtain
memory using an allocator (see 16.4.4.6 <a href="https://wg21.link/allocator.requirements">[allocator.requirements]</a>).
<ins>[<i>Note:</i> In particular, containers and iterators
do not store references to allocated elements other than through the
allocator's pointer type, i.e., as objects of type <code><i>P</i></code> or
<code>pointer_traits&lt;<i>P</i>&gt;::template rebind&lt;<i>unspecified</i>&gt;</code>,
where <code><i>P</i></code> is
<code>allocator_traits&lt;allocator_type&gt;::pointer</code>. &mdash; <i>end note</i>]</ins>
</p></blockquote>





</body>
</html>
