<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 3477: Simplify constraints for semiregular-box</title>
<meta property="og:title" content="Issue 3477: Simplify constraints for semiregular-box">
<meta property="og:description" content="C++ library issue. Status: C++23">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue3477.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++23">C++23</a> status.</em></p>
<h3 id="3477"><a href="lwg-defects.html#3477">3477</a>. Simplify constraints for <code><i>semiregular-box</i></code></h3>
<p><b>Section:</b> 25.7.3 <a href="https://wg21.link/range.move.wrap">[range.move.wrap]</a> <b>Status:</b> <a href="lwg-active.html#C++23">C++23</a>
 <b>Submitter:</b> Casey Carter <b>Opened:</b> 2020-08-19 <b>Last modified:</b> 2023-11-22</p>
<p><b>Priority: </b>0
</p>
<p><b>View all other</b> <a href="lwg-index.html#range.move.wrap">issues</a> in [range.move.wrap].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++23">C++23</a> status.</p>
<p><b>Discussion:</b></p>
<p>
The exposition-only <code><i>semiregular-box</i></code> class template specified in  [range.semi.wrap] 
implements a default constructor, copy assignment operator, and move assignment operator atop the facilities 
provided by <code>std::optional</code> when the wrapped type is not default constructible, copy assignable, or 
move assignable (respectively). The constraints on the copy and move assignment operator implementations go 
out of their way to be unnecessarily minimal. The meaning of the constraint on the copy assignment operator 
&mdash; <code>!assignable&lt;T, const T&amp;&gt;</code> &mdash; has even changed since this wording was written 
as a result of LWG reformulating the implicit expression variations wording in 18.2 <a href="https://wg21.link/concepts.equality">[concepts.equality]</a>.
<p/>
It would be much simpler for implementors and users if we recall that minimality is not the primary goal of 
constraints and instead constrain these assignment operators more simply with 
<code>!movable&lt;T&gt;</code> and <code>!copyable&lt;T&gt;</code>.
</p>

<p><i>[2020-09-03; Reflector prioritization]</i></p>

<p>
Set priority to 0 and status to Tentatively Ready after six votes in favour during reflector discussions.
</p>
<p><i>[2020-11-09 Approved In November virtual meeting. Status changed: Tentatively Ready &rarr; WP.]</i></p>



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

<ol>
<li><p>Modify  [range.semi.wrap] as indicated:</p>

<blockquote>
<p>
-1- Many types in this subclause are specified in terms of an exposition-only class template 
<code><i>semiregular-box</i></code>. <code><i>semiregular-box</i>&lt;T&gt;</code> behaves exactly like 
<code>optional&lt;T&gt;</code> with the following differences:
</p>
<ol style="list-style-type: none">
<li><p>(1.1) &mdash; [&hellip;]</p></li>
<li><p>(1.2) &mdash; [&hellip;]</p></li>
<li><p>(1.3) &mdash; If <code><del>assignable_from&lt;T&amp;, const T&amp;&gt;</del><ins>copyable&lt;T&gt;</ins></code> 
is not modeled, the copy assignment operator is equivalent to:</p>
<pre>
<i>semiregular-box</i>&amp; operator=(const <i>semiregular-box</i>&amp; that)
  noexcept(is_nothrow_copy_constructible_v&lt;T&gt;)
{
  if (that) emplace(*that);
  else reset();
  return *this;
}
</pre>
</li>
<li><p>(1.4) &mdash; If <code><del>assignable_from&lt;T&amp;, T&gt;</del><ins>movable&lt;T&gt;</ins></code> 
is not modeled, the move assignment operator is equivalent to:</p>
<pre>
<i>semiregular-box</i>&amp; operator=(<i>semiregular-box</i>&amp;&amp; that)
  noexcept(is_nothrow_move_constructible_v&lt;T&gt;)
{
  if (that) emplace(std::move(*that));
  else reset();
  return *this;
}
</pre>
</li>
</ol>
</blockquote>
</li>

</ol>





</body>
</html>
