<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 3346: pair and tuple copy and move constructor have backwards specification</title>
<meta property="og:title" content="Issue 3346: pair and tuple copy and move constructor have backwards specification">
<meta property="og:description" content="C++ library issue. Status: C++20">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue3346.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="3346"><a href="lwg-defects.html#3346">3346</a>. <code>pair</code> and <code>tuple</code> copy and move constructor have backwards specification</h3>
<p><b>Section:</b> 22.3.2 <a href="https://wg21.link/pairs.pair">[pairs.pair]</a>, 22.4.4.2 <a href="https://wg21.link/tuple.cnstr">[tuple.cnstr]</a> <b>Status:</b> <a href="lwg-active.html#C++20">C++20</a>
 <b>Submitter:</b> Richard Smith <b>Opened:</b> 2019-11-26 <b>Last modified:</b> 2021-02-25</p>
<p><b>Priority: </b>0
</p>
<p><b>View other</b> <a href="lwg-index-open.html#pairs.pair">active issues</a> in [pairs.pair].</p>
<p><b>View all other</b> <a href="lwg-index.html#pairs.pair">issues</a> in [pairs.pair].</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>
22.3.2 <a href="https://wg21.link/pairs.pair">[pairs.pair]</a> p2 and 22.4.4.2 <a href="https://wg21.link/tuple.cnstr">[tuple.cnstr]</a> p3 say:
</p>
<blockquote>
<p>
The defaulted move and copy constructor, respectively, of {<code>pair</code>,<code>tuple</code>} is a constexpr 
function if and only if all required element-wise initializations for copy and move, respectively, 
would satisfy the requirements for a constexpr function.
</p>
</blockquote>
<p>
Note that we specify the copy constructor in terms of element move operations and the move constructor 
in terms of element copy operations. Is that really the intent? This appears to be how this was originally 
specified when the wording was added by <a href="https://wg21.link/n3471">N3471</a>.
</p>

<p><i>[2019-12-01; Daniel comments and provides wording]</i></p>

<p>
These inverted wording effects are an unintended oversight caused by <a href="https://wg21.link/n3471">N3471</a>.
</p>

<p><i>[2019-12-08 Issue Prioritization]</i></p>

<p>Status to Tentatively Ready and priority to 0 after ten positive votes on the reflector.</p>


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

<ol>
<li><p>Modify 22.3.2 <a href="https://wg21.link/pairs.pair">[pairs.pair]</a> as indicated:</p>

<blockquote>
<p>
-2- The defaulted move and copy constructor, respectively, of <code>pair</code> shall be a constexpr function 
if and only if all required element-wise initializations for <del>copy</del><ins>move</ins> and 
<del>move</del><ins>copy</ins>, respectively, would satisfy the requirements for a constexpr function.
</p>
</blockquote>
</li>

<li><p>Modify 22.4.4.2 <a href="https://wg21.link/tuple.cnstr">[tuple.cnstr]</a> as indicated:</p>

<blockquote>
<p>
-3- The defaulted move and copy constructor, respectively, of <code>tuple</code> shall be a constexpr function 
if and only if all required element-wise initializations for <del>copy</del><ins>move</ins> and 
<del>move</del><ins>copy</ins>, respectively, would satisfy the requirements for a constexpr function. 
The defaulted move and copy constructor of <code>tuple&lt;&gt;</code> shall be constexpr functions.
</p>
</blockquote>
</li>


</ol>




</body>
</html>
