<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2045: forward_list::merge and forward_list::splice_after with unequal allocators</title>
<meta property="og:title" content="Issue 2045: forward_list::merge and forward_list::splice_after with unequal allocators">
<meta property="og:description" content="C++ library issue. Status: C++14">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2045.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="2045"><a href="lwg-defects.html#2045">2045</a>. <code>forward_list::merge</code> and <code>forward_list::splice_after</code> with unequal allocators</h3>
<p><b>Section:</b> 23.3.7.6 <a href="https://wg21.link/forward.list.ops">[forward.list.ops]</a> <b>Status:</b> <a href="lwg-active.html#C++14">C++14</a>
 <b>Submitter:</b> Pablo Halpern <b>Opened:</b> 2011-03-24 <b>Last modified:</b> 2023-02-07</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#forward.list.ops">issues</a> in [forward.list.ops].</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>
See also: <a href="lwg-defects.html#1215" title="list::merge with unequal allocators (Status: C++11)">1215</a><sup><a href="https://cplusplus.github.io/LWG/issue1215" title="Latest snapshot">(i)</a></sup>
</p>

<p>
<code>list::merge</code> and <code>list::splice</code> have the requirement that the two lists being merged or 
spliced must use the same allocator. Otherwise, moving list nodes from one container to the other would 
corrupt the data structure. The same requirement is needed for <code>forward_list::merge</code> and 
<code>forward_list::splice_after</code>.
</p>

<p><i>[
2011 Bloomington
]</i></p>


<p>
Move to Ready.
</p>



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

<p>This wording is relative to the FDIS.</p>

<ol>
<li><p>In  [forwardlist.ops] p. 1 change as indicated:</p>

<blockquote><pre>
void splice_after(const_iterator position, forward_list&lt;T,Allocator&gt;&amp; x);
void splice_after(const_iterator position, forward_list&lt;T,Allocator&gt;&amp;&amp; x);
</pre><p>
1 - <i>Requires</i>: <code>position</code> is <code>before_begin()</code> or is a dereferenceable 
iterator in the range [<code>begin()</code>,<code>end()</code>). <ins><code>get_allocator() == x.get_allocator()</code>.</ins> 
<code>&amp;x != this</code>.
</p></blockquote>

</li>

<li><p>In  [forwardlist.ops] p. 5 change as indicated:</p>

<blockquote><pre>
void splice_after(const_iterator position, forward_list&lt;T,Allocator&gt;&amp; x, const_iterator i);
void splice_after(const_iterator position, forward_list&lt;T,Allocator&gt;&amp;&amp; x, const_iterator i);
</pre><p>
5 - <i>Requires</i>: <code>position</code> is <code>before_begin()</code> or is a dereferenceable 
iterator in the range [<code>begin()</code>,<code>end()</code>). The iterator following <code>i</code> is a 
dereferenceable iterator in <code>x</code>. <ins><code>get_allocator() == x.get_allocator()</code>.</ins>
</p></blockquote>

</li>

<li><p>In  [forwardlist.ops] p. 9 change as indicated:</p>

<blockquote><pre>
void splice_after(const_iterator position, forward_list&lt;T,Allocator&gt;&amp; x, 
                  const_iterator first, const_iterator last);
void splice_after(const_iterator position, forward_list&lt;T,Allocator&gt;&amp;&amp; x, 
                  const_iterator first, const_iterator last);
</pre><p>
9 - <i>Requires</i>: <code>position</code> is <code>before_begin()</code> or is a dereferenceable 
iterator in the range [<code>begin()</code>,<code>end()</code>). (<code>first</code>,<code>last</code>) is a valid range 
in <code>x</code>, and all iterators in the range (<code>first</code>,<code>last</code>) are dereferenceable.
<code>position</code> is not an iterator in the range (<code>first</code>,<code>last</code>). 
<ins><code>get_allocator() == x.get_allocator()</code>.</ins>
</p></blockquote>

</li>

<li><p>In  [forwardlist.ops] p. 18 change as indicated:</p>

<blockquote><pre>
void merge(forward_list&lt;T,Allocator&gt;&amp; x);
void merge(forward_list&lt;T,Allocator&gt;&amp;&amp; x);
template &lt;class Compare&gt; void merge(forward_list&lt;T,Allocator&gt;&amp; x, Compare comp);
template &lt;class Compare&gt; void merge(forward_list&lt;T,Allocator&gt;&amp;&amp; x, Compare comp);
</pre><p>
18 - <i>Requires</i>: <code>comp</code> defines a strict weak ordering ([alg.sorting]), and <code>*this</code> 
and <code>x</code> are both sorted according to this ordering. <ins><code>get_allocator() == x.get_allocator()</code>.</ins>
</p></blockquote>

</li>

</ol>






</body>
</html>
