<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2552: priority_queue doesn't work with move-only types</title>
<meta property="og:title" content="Issue 2552: priority_queue doesn't work with move-only types">
<meta property="og:description" content="C++ library issue. Status: NAD">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2552.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="2552"><a href="lwg-closed.html#2552">2552</a>. <code>priority_queue</code> doesn't work with move-only types</h3>
<p><b>Section:</b> 23.6.4 <a href="https://wg21.link/priority.queue">[priority.queue]</a> <b>Status:</b> <a href="lwg-active.html#NAD">NAD</a>
 <b>Submitter:</b> Matt Austern <b>Opened:</b> 2015-10-27 <b>Last modified:</b> 2016-02-07</p>
<p><b>Priority: </b>3
</p>
<p><b>View all other</b> <a href="lwg-index.html#priority.queue">issues</a> in [priority.queue].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#NAD">NAD</a> status.</p>
<p><b>Discussion:</b></p>
<p>
Suppose we want to remove and process the topmost element of a <code>priority_queue&lt;T&gt;</code>. For a copyable type we might write
</p>
<blockquote><pre>
auto tmp = q.top();
q.pop();
</pre></blockquote>
<p>
but of course that doesn't work if <code>T</code> is move-only. Nothing of that sort can work, since moving out of <code>top()</code> 
would make the subsequent call to <code>pop()</code> fail.
<p/>
Currently, <code>pop()</code> is defined to perform
</p>
<blockquote><pre>
pop_heap(c.begin(), c.end(), comp);
c.pop_back();
</pre></blockquote>
<p>
so the removed value continues to exist between the first and second lines but there isn't any access to it. The sort of 
primitive that would allow consuming and removing the topmost element would be some variation on this, e.g.
</p>
<blockquote><pre>
pop_heap(c.begin(), c.end(), comp);
auto tmp = move(c.back());
c.pop_back();
return tmp;
</pre></blockquote>

<p><i>[2016-02, Issues Telecon]</i></p>

<p>
This should be addressed by a paper addressed to LEWG.
</p>


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





</body>
</html>
