<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 3024: variant's copies must be deleted instead of disabled via SFINAE</title>
<meta property="og:title" content="Issue 3024: variant's copies must be deleted instead of disabled via SFINAE">
<meta property="og:description" content="C++ library issue. Status: C++20">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue3024.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="3024"><a href="lwg-defects.html#3024">3024</a>. <code>variant</code>'s copies must be deleted instead of disabled via SFINAE</h3>
<p><b>Section:</b> 22.6.3.2 <a href="https://wg21.link/variant.ctor">[variant.ctor]</a> <b>Status:</b> <a href="lwg-active.html#C++20">C++20</a>
 <b>Submitter:</b> Casey Carter <b>Opened:</b> 2017-10-10 <b>Last modified:</b> 2021-02-25</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View other</b> <a href="lwg-index-open.html#variant.ctor">active issues</a> in [variant.ctor].</p>
<p><b>View all other</b> <a href="lwg-index.html#variant.ctor">issues</a> in [variant.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 specification of <code>variant</code>'s copy constructor and copy assignment
operator require that those functions do not participate in overload resolution
unless certain conditions are satisfied. There is no mechanism in C++ that makes
it possible to prevent a copy constructor or copy assignment operator from
participating in overload resolution. These functions should instead be specified
to be defined as deleted unless the requisite conditions hold, as we did for the
copy constructor and copy assignment operator of <code>optional</code> in LWG
<a href="lwg-defects.html#2756" title="C++ WP optional&lt;T&gt; should 'forward' T's implicit conversions (Status: C++17)">2756</a><sup><a href="https://cplusplus.github.io/LWG/issue2756" title="Latest snapshot">(i)</a></sup>.
</p>

<p><i>[
2017-10-11 Moved to Tentatively Ready after 5 positive votes on c++std-lib.
]</i></p>



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

<ol>
<li><p>Change 22.6.3.2 <a href="https://wg21.link/variant.ctor">[variant.ctor]</a> as indicated:</p>

<blockquote>
<pre>
variant(const variant&amp; w);
</pre>
<blockquote>
<p>
-6- <i>Effects:</i> If <code>w</code> holds a value, initializes the <code>variant</code>
to hold the same alternative as <code>w</code> and direct-initializes the contained
value with <code>get&lt;j&gt;(w)</code>, where <code>j</code> is <code>w.index()</code>.
Otherwise, initializes the <code>variant</code> to not hold a value.
</p>
<p>
-7- <i>Throws:</i> Any exception thrown by direct-initializing any
<code>T<sub><i>i</i></sub></code> for all <i>i</i>.
</p>
<p>
-8- <i>Remarks:</i> This <del>function shall not participate in overload
resolution</del><ins>constructor shall be defined as deleted</ins> unless
<code>is_copy_constructible_v&lt;T<sub><i>i</i></sub>&gt;</code> is true for all
<i>i</i>.
</p>
</blockquote>
</blockquote>
</li>

<li><p>Change 22.6.3.4 <a href="https://wg21.link/variant.assign">[variant.assign]</a> as indicated:</p>

<blockquote>
<pre>
variant&amp; operator=(const variant&amp; rhs);
</pre>
<blockquote>
<p>
[&hellip;]
</p>
<p>
-4- <i>Postconditions:</i> <code>index() == rhs.index()</code>.
</p>
<p>
-5- <i>Remarks:</i> This <del>function shall not participate in overload
resolution</del><ins>operator shall be defined as deleted</ins> unless
<code>is_copy_constructible_v&lt;T<sub><i>i</i></sub>&gt; &amp;&amp;
is_copy_assignable_v&lt;T<sub><i>i</i></sub>&gt;</code> is true for all <i>i</i>.
</p>
</blockquote>
</blockquote>
</li>
</ol>





</body>
</html>
