<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2211: Replace ambiguous use of "Allocator" in container requirements</title>
<meta property="og:title" content="Issue 2211: Replace ambiguous use of &quot;Allocator&quot; in container requirements">
<meta property="og:description" content="C++ library issue. Status: C++14">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2211.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++14">C++14</a> status.</em></p>
<h3 id="2211"><a href="lwg-defects.html#2211">2211</a>. Replace ambiguous use of "Allocator" in container requirements</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++14">C++14</a>
 <b>Submitter:</b> Jonathan Wakely <b>Opened:</b> 2012-11-07 <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++14">C++14</a> status.</p>
<p><b>Discussion:</b></p>

<p>
23.2.2 <a href="https://wg21.link/container.requirements.general">[container.requirements.general]</a>/7 says:
</p>
<blockquote><p>
All other constructors for these container types take an <code>Allocator&amp;</code> argument 
(16.4.4.6 <a href="https://wg21.link/allocator.requirements">[allocator.requirements]</a>), an allocator whose value type is the same as the
container's value type.
</p></blockquote>
<p>
This is a strange place to state the requirement on the allocator's
<code>value_type</code>, because the allocator is a property (and template
parameter) of the container type not of some of its constructors.
It's also unclear whether "<code>Allocator&amp;</code>" refers to the concept (as
implied by the cross-reference to the allocator requirements in Clause 17) 
or to the container's template parameter (as implied by the fact
it's shown as an lvalue-reference type.) I believe the latter is
intended, because those constructors can't take any model of the
allocator concept, they can only take the container's <code>allocator_type</code>.
<p/>
I think it would be clearer to remove the value type requirement earlier
in the paragraph (Table 99 already imposes that requirement) and to make it clear 
the constructor arguments are the container's <code>allocator_type</code>. There is 
already a cross-reference to the allocator requirements earlier in the paragraph, 
so it doesn't need to be repeated in another place where it causes confusion.
</p>

<p><i>[2013-03-15 Issues Teleconference]</i></p>

<p>
Moved to Tentatively Ready.
</p>

<p><i>[2013-04-20 Bristol]</i></p>




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

<ol>
<li><p>Edit 23.2.2 <a href="https://wg21.link/container.requirements.general">[container.requirements.general]</a> paragraph 7:</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>). Copy constructors for these container types obtain an 
allocator by calling <code>allocator_traits&lt;allocator_type&gt;::select_on_container_copy_construction</code> 
on their first parameters. Move constructors obtain an allocator by move construction from the allocator 
belonging to the container being moved. Such move construction of the allocator shall not exit via 
an exception. All other constructors for these container types take <del>an <code>Allocator&amp;</code> argument 
(16.4.4.6 <a href="https://wg21.link/allocator.requirements">[allocator.requirements]</a>), an allocator whose value type is the same as the container's value
type</del><ins>a <code>const allocator_type&amp;</code> argument</ins>. [<i>Note</i>: If an invocation of a 
constructor uses the default value of an optional allocator argument, then the <code>Allocator</code> type 
must support value initialization. &mdash; <i>end note</i>] A copy of this allocator is used for any
memory allocation performed, by these constructors and by all member functions, during the lifetime of each
container object or until the allocator is replaced. [&hellip;]
</p>
</blockquote>
</li>
</ol>






</body>
</html>
