<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 3703: Missing requirements for expected&lt;T, E&gt; requires is_void&lt;T&gt;</title>
<meta property="og:title" content="Issue 3703: Missing requirements for expected&lt;T, E&gt; requires is_void&lt;T&gt;">
<meta property="og:description" content="C++ library issue. Status: C++23">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue3703.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="3703"><a href="lwg-defects.html#3703">3703</a>. Missing requirements for <code>expected&lt;T, E&gt; requires is_void&lt;T&gt;</code></h3>
<p><b>Section:</b> 22.8.7.1 <a href="https://wg21.link/expected.void.general">[expected.void.general]</a> <b>Status:</b> <a href="lwg-active.html#C++23">C++23</a>
 <b>Submitter:</b> Casey Carter <b>Opened:</b> 2022-05-24 <b>Last modified:</b> 2023-11-22</p>
<p><b>Priority: </b>2
</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 partial specialization <code>expected&lt;T, E&gt; requires is_void&lt;T&gt;</code> specified in 
22.8.7.1 <a href="https://wg21.link/expected.void.general">[expected.void.general]</a> is missing some template parameter requirements that should 
have been copied from 22.8.6.1 <a href="https://wg21.link/expected.object.general">[expected.object.general]</a>. We should copy the pertinent 
requirements from the first two paragraphs of the latter subclause into new paragraphs in the first 
subclause (the pertinent requirement from the third paragraph is already present in 
22.8.7.1 <a href="https://wg21.link/expected.void.general">[expected.void.general]</a>).
</p>

<p><i>[2022-06-21; Jonathan adds "<ins>Member</ins>" before "<code>has_val</code>"]</i></p>



<p><i>[2022-06-21; Reflector poll]</i></p>

<p>
Set priority to 2 after reflector poll.
</p>


<p><i>[2022-06-21; Reflector poll]</i></p>

<p>
Set status to Tentatively Ready after five votes in favour during reflector poll.
</p>

<p><i>[2022-07-15; LWG telecon: move to Ready]</i></p>


<p><i>[2022-07-25 Approved at July 2022 virtual plenary. Status changed: Ready &rarr; WP.]</i></p>



<p id="res-3703"><b>Proposed resolution:</b></p>
<p>
This wording is relative to <a href="https://wg21.link/N4910" title=" Working Draft, Standard for Programming Language C++">N4910</a>.
</p>

<blockquote class="note">
<p>
[<i>Drafting note:</i> There is some drive-by cleanup that I couldn't resist while touching this wording: (1) 
strike the redundant "suitably aligned" guarantee, (2) Don't repeat in prose that the exposition-only members 
are exposition-only.]
</p>
</blockquote>

<ol>
<li><p>Modify 22.8.6.1 <a href="https://wg21.link/expected.object.general">[expected.object.general]</a> as indicated:</p>

<blockquote>
<p>
-1- Any object of type <code>expected&lt;T, E&gt;</code> either contains a value of type <code>T</code> or a value 
of type <code>E</code> within its own storage. Implementations are not permitted to use additional storage, such 
as dynamic memory, to allocate the object of type <code>T</code> or the object of type <code>E</code>. <del>These objects 
are allocated in a region of the <code>expected&lt;T, E&gt;</code> storage suitably aligned for the types <code>T</code> 
and <code>E</code>. Members <code><i>has_val</i></code>, <code><i>val</i></code>, and <code><i>unex</i></code> are provided 
for exposition only.</del> <ins>Member</ins> <code><i>has_val</i></code> indicates whether the <code>expected&lt;T, E&gt;</code> object 
contains an object of type <code>T</code>.
</p>
</blockquote>
</li>

<li><p>Modify 22.8.7.1 <a href="https://wg21.link/expected.void.general">[expected.void.general]</a> as indicated:</p>

<blockquote>
<p>
<ins>-?- Any object of type <code>expected&lt;T, E&gt;</code> either represents a value of type <code>T</code>, or contains 
a value of type <code>E</code> within its own storage. Implementations are not permitted to use additional storage, 
such as dynamic memory, to allocate the object of type <code>E</code>. Member <code><i>has_val</i></code> indicates whether the 
<code>expected&lt;T, E&gt;</code> object represents a value of type <code>T</code>.</ins>
<p/>
<ins>-?- A program that instantiates the definition of the template <code>expected&lt;T, E&gt;</code> with a type for the 
<code>E</code> parameter that is not a valid template argument for <code>unexpected</code> is ill-formed.</ins>
<p/>
-1- <code>E</code> shall meet the requirements of <i>Cpp17Destructible</i> (Table [tab:cpp17.destructible]).
</p>
</blockquote>
</li>

</ol>





</body>
</html>
