<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2944: LWG 2905 accidentally removed requirement that construction of the deleter doesn't throw an exception</title>
<meta property="og:title" content="Issue 2944: LWG 2905 accidentally removed requirement that construction of the deleter doesn't throw an exception">
<meta property="og:description" content="C++ library issue. Status: C++20">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2944.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++20">C++20</a> status.</em></p>
<h3 id="2944"><a href="lwg-defects.html#2944">2944</a>. LWG 2905 accidentally removed requirement that construction of the deleter doesn't throw an exception</h3>
<p><b>Section:</b> 20.3.1.3.2 <a href="https://wg21.link/unique.ptr.single.ctor">[unique.ptr.single.ctor]</a> <b>Status:</b> <a href="lwg-active.html#C++20">C++20</a>
 <b>Submitter:</b> Tim Song <b>Opened:</b> 2017-03-11 <b>Last modified:</b> 2021-02-25</p>
<p><b>Priority: </b>0
</p>
<p><b>View all other</b> <a href="lwg-index.html#unique.ptr.single.ctor">issues</a> in [unique.ptr.single.ctor].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++20">C++20</a> status.</p>
<p><b>Discussion:</b></p>
<p>
The wording simplification in LWG <a href="lwg-defects.html#2905" title="is_constructible_v&lt;unique_ptr&lt;P, D&gt;, P, D const &amp;&gt; should be false when 
D is not copy constructible (Status: C++17)">2905</a><sup><a href="https://cplusplus.github.io/LWG/issue2905" title="Latest snapshot">(i)</a></sup> accidentally deleted the
requirement that construction of the deleter doesn't throw an
exception. While this isn't the end of the world since any exception
will just run into the noexcept on the constructor and result in a
call to <code>std::terminate()</code>, the other <code>unique_ptr</code> constructors still have
a similar no-exception <i>Requires:</i> clause, leaving us in the odd
situation where throwing an exception results in undefined behavior
for some constructors and <code>terminate()</code> for others. If guaranteeing
<code>std::terminate()</code> on exception is desirable, that should be done across
the board.
<p/>
The proposed wording below simply restores the nothrow requirement
along with the <code>Copy/MoveConstructible</code> requirement. Wording for the
other alternative (guaranteed <code>std::terminate()</code>) can be produced if
desired.
</p>

<p><i>[2017-03-16, Daniel comments]</i></p>

<p>
The publication of the new working draft is awaited, before proposed wording against that
new working draft is formally possible.
</p>
  
<p><i>[2017-05-03, Tim comments]</i></p>

<p>
The suggested wording has been moved to the PR section now that the new working draft is available.
</p>

<p><i>[2017-07 Toronto Wed Issue Prioritization]</i></p>

<p>Priority 0; Move to Ready</p>


<p id="res-2944"><b>Proposed resolution:</b></p>
<p>
This wording is relative to <a href="https://wg21.link/n4659">N4659</a>.
</p>

<ol>
<li><p>Insert a paragraph after 20.3.1.3.2 <a href="https://wg21.link/unique.ptr.single.ctor">[unique.ptr.single.ctor]</a> p11:</p>
<blockquote>
<pre>
unique_ptr(pointer p, <i>see below</i> d1) noexcept;
unique_ptr(pointer p, <i>see below</i> d2) noexcept;
</pre>
<blockquote>
<p>
-9- The signature of these constructors depends upon whether <code>D</code> is a reference type. If <code>D</code> 
is a non-reference type <code>A</code>, then the signatures are:
<p/>
[&hellip;]
<p/>
-10- If <code>D</code> is an lvalue reference type <code>A&amp;</code>, then the signatures are:
<p/>
[&hellip;]
<p/>
-11- If <code>D</code> is an lvalue reference type <code>const A&amp;</code>, then the signatures are:
<p/>
[&hellip;]
<p/>
<ins>-??- <i>Requires:</i> For the first constructor, if <code>D</code> is not a reference
type, <code>D</code> shall satisfy the requirements of <code>CopyConstructible</code> and such
construction shall not exit via an exception. For the second
constructor, if <code>D</code> is not a reference type, <code>D</code> shall satisfy the
requirements of <code>MoveConstructible</code> and such construction shall not exit
via an exception.</ins>
</p>
</blockquote>
</blockquote>
</li></ol>






</body>
</html>
