<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2750: [fund.ts.v2] LWG 2451 conversion constructor constraint</title>
<meta property="og:title" content="Issue 2750: [fund.ts.v2] LWG 2451 conversion constructor constraint">
<meta property="og:description" content="C++ library issue. Status: TS">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2750.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#TS">TS</a> status.</em></p>
<h3 id="2750"><a href="lwg-defects.html#2750">2750</a>. [fund.ts.v2] LWG 2451 conversion constructor constraint</h3>
<p><b>Section:</b> 5.3.1 <a href="https://cplusplus.github.io/fundamentals-ts/v2.html#optional.object.ctor">[fund.ts.v2::optional.object.ctor]</a> <b>Status:</b> <a href="lwg-active.html#TS">TS</a>
 <b>Submitter:</b> Casey Carter <b>Opened:</b> 2016-07-20 <b>Last modified:</b> 2017-07-30</p>
<p><b>Priority: </b>0
</p>
<p><b>View all issues with</b> <a href="lwg-status.html#TS">TS</a> status.</p>
<p><b>Discussion:</b></p>
<p><b>Addresses: fund.ts.v2</b></p>
<p>
LWG <a href="lwg-defects.html#2451" title="[fund.ts.v2] optional&lt;T&gt; should 'forward' T's implicit conversions (Status: TS)">2451</a><sup><a href="https://cplusplus.github.io/LWG/issue2451" title="Latest snapshot">(i)</a></sup> adds a converting constructor to <code>optional</code> with signature:
</p>
<blockquote>
<pre>
template &lt;class U&gt;
constexpr optional(U&amp;&amp; v);
</pre>
</blockquote>
<p>
and specifies that "This constructor shall not participate in overload resolution unless 
<code>is_constructible_v&lt;T, U&amp;&amp;&gt;</code> is <code>true</code> and <code>U</code> is not the same type as <code>T</code>." 
This suffices to avoid this constructor being selected by overload resolution for arguments that should match the 
move constructor, but not for arguments that should match the copy constructor. The recent churn around tuple's 
constructors suggests that we want this constructor to not participate in overload resolution if 
<code>remove_cv_t&lt;remove_reference_t&lt;U&gt;&gt;</code> is the same type as <code>T</code>.
</p>
<p><i>[2016-07 Chicago]</i></p>

<p>Monday: P0 - tentatively ready</p>


<p id="res-2750"><b>Proposed resolution:</b></p>
<p>This wording is relative to <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4600.html">N4600</a>.</p>

<blockquote class="note">
<p>
Wording relative to N4600 + LWG <a href="lwg-defects.html#2451" title="[fund.ts.v2] optional&lt;T&gt; should 'forward' T's implicit conversions (Status: TS)">2451</a><sup><a href="https://cplusplus.github.io/LWG/issue2451" title="Latest snapshot">(i)</a></sup>, although it should be noted that this resolution should be applied 
wherever LWG <a href="lwg-defects.html#2451" title="[fund.ts.v2] optional&lt;T&gt; should 'forward' T's implicit conversions (Status: TS)">2451</a><sup><a href="https://cplusplus.github.io/LWG/issue2451" title="Latest snapshot">(i)</a></sup> is applied, be that to the fundamentals TS or the specification of <code>optional</code> in the 
C++ Working Paper.
</p>
</blockquote>

<ol>
<li><p>In 5.3.1 <a href="https://cplusplus.github.io/fundamentals-ts/v2.html#optional.object.ctor">[fund.ts.v2::optional.object.ctor]</a>, modify as indicated:</p>

<blockquote>
<pre>
template &lt;class U&gt;
  constexpr optional(U&amp;&amp; v);
</pre>
<blockquote>
<p>
[&hellip;]
<p/>
-43- <i>Remarks:</i> If <code>T</code>'s selected constructor is a <code>constexpr</code> constructor, this constructor shall 
be a <code>constexpr</code> constructor. This constructor shall not participate in overload resolution unless 
<code>is_constructible_v&lt;T, U&amp;&amp;&gt;</code> is <code>true</code> and <code><ins>decay_t&lt;</ins>U<ins>&gt;</ins></code> 
is not the same type as <code>T</code>. The constructor is explicit if and only if <code>is_convertible_v&lt;U&amp;&amp;, T&gt;</code> 
is <code>false</code>.
</p>
</blockquote>
</blockquote>
</li>
</ol>





</body>
</html>
