<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2802: shared_ptr constructor requirements for a deleter</title>
<meta property="og:title" content="Issue 2802: shared_ptr constructor requirements for a deleter">
<meta property="og:description" content="C++ library issue. Status: C++17">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2802.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="2802"><a href="lwg-defects.html#2802">2802</a>. <code>shared_ptr</code> constructor requirements for a deleter</h3>
<p><b>Section:</b> 20.3.2.2.2 <a href="https://wg21.link/util.smartptr.shared.const">[util.smartptr.shared.const]</a> <b>Status:</b> <a href="lwg-active.html#C++17">C++17</a>
 <b>Submitter:</b> United States <b>Opened:</b> 2016-11-09 <b>Last modified:</b> 2020-09-06</p>
<p><b>Priority: </b>2
</p>
<p><b>View other</b> <a href="lwg-index-open.html#util.smartptr.shared.const">active issues</a> in [util.smartptr.shared.const].</p>
<p><b>View all other</b> <a href="lwg-index.html#util.smartptr.shared.const">issues</a> in [util.smartptr.shared.const].</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>
<b>Addresses US 127</b>
<p/>
It should suffice for the deleter <code>D</code> to be nothrow move-constructible.
However, to avoid potentially leaking the pointer <code>p</code> if <code>D</code> is also 
copy-constructible when copying the argument by-value, we should continue 
to require the copy constructor does not throw if <code>D</code> 
is <code>CopyConstructible</code>.
</p>
<p>
Proposed change:
<p/>
Relax the requirement the <code>D</code> be <code>CopyConstructible</code> 
to simply require that <code>D</code> be <code>MoveConstructible</code>.  
Clarify the requirement that construction of any of the arguments 
passed by-value shall not throw exceptions. Note that we have library-wide 
wording in clause 17 that says any type supported by the 
library, not just this delete, shall not throw exceptions from its destructor, 
so that wording could be editorially removed. Similarly, the requirements 
that <code>A</code> shall be an allocator satisfy that neither 
constructor nor destructor for <code>A</code> can throw.
</p>

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

<p>Priority 3; Jonathan to provide wording.</p>

<p><i>[2017-02-23, Jonathan comments and suggests wording]</i></p>

<p>
I don't think the Clause 17 wording in [res.on.functions] is
sufficient to require that the delete expression is well-formed. A
class-specific deallocation function ([class.free]) would not be
covered by [res.on.functions] and so could throw:
</p>
<blockquote><pre>
struct Y { void operator delete(void*) noexcept(false) { throw 1; } };
</pre></blockquote>

<p><i>[Kona 2017-02-27]</i></p>

<p>Accepted as Immediate to resolve NB comment.</p>


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

<ol>
<li><p>Modify 20.3.2.2.2 <a href="https://wg21.link/util.smartptr.shared.const">[util.smartptr.shared.const]</a> as indicated:</p>
<blockquote>
<pre>
template&lt;class Y, class D&gt; shared_ptr(Y* p, D d);
template&lt;class Y, class D, class A&gt; shared_ptr(Y* p, D d, A a);
template &lt;class D&gt; shared_ptr(nullptr_t p, D d);
template &lt;class D, class A&gt; shared_ptr(nullptr_t p, D d, A a);
</pre>
<blockquote>
<p>
-8- <i>Requires:</i> <code>D</code> shall be <code><del>Copy</del><ins>Move</ins>Constructible</code> and <del>such</del> 
construction <ins>of <code>d</code> and a deleter of type <code>D</code> initialized with <code>std::move(d)</code></ins> shall 
not throw exceptions. <del>The destructor of <code>D</code> shall not throw exceptions.</del> The expression <code>d(p)</code> 
shall be well formed, shall have well<del> </del><ins>-</ins>defined behavior, and shall not throw exceptions. <code>A</code> 
shall be an allocator (17.5.3.5). <del>The copy constructor and destructor of <code>A</code> shall not throw exceptions.</del> 
When <code>T</code> is [&hellip;].
</p>
</blockquote>
</blockquote>
</li>
</ol>





</body>
</html>
