<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2008: Conflicting Error Conditions for packaged_task::operator()</title>
<meta property="og:title" content="Issue 2008: Conflicting Error Conditions for packaged_task::operator()">
<meta property="og:description" content="C++ library issue. Status: C++11">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2008.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++11">C++11</a> status.</em></p>
<h3 id="2008"><a href="lwg-defects.html#2008">2008</a>. Conflicting Error Conditions for <code>packaged_task::operator()</code></h3>
<p><b>Section:</b> 32.10.10.2 <a href="https://wg21.link/futures.task.members">[futures.task.members]</a> <b>Status:</b> <a href="lwg-active.html#C++11">C++11</a>
 <b>Submitter:</b> Pete Becker <b>Opened:</b> 2010-06-21 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#futures.task.members">issues</a> in [futures.task.members].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++11">C++11</a> status.</p>
<p><b>Discussion:</b></p>
<p>
The Throws clause for <code>packaged_task::operator()</code> says that it throws "a
<code>future_error</code> exception object if there is no associated asynchronous
state or the stored task has already been invoked." However, the Error
Conditions clause does not define an error condition when the stored task has
already been invoked, only when the associated state is already ready (i.e. the
invocation has completed).
</p>

<p><i>[2011-02-17 Anthony provides an alternative resolution]</i></p>


<p><strong>Previous</strong> proposed resolution:</p>

<p>
Change the first bullet item in 32.10.10.2 <a href="https://wg21.link/futures.task.members">[futures.task.members]</a> /22:
</p>

<blockquote><pre>
void operator()(ArgTypes... args);
</pre>
<blockquote>
<p>
20 ...
</p>
<p>
21 ...
</p>
<p>
22 <i>Error conditions:</i>
</p>
<ul>
<li>
<code>promise_already_satisfied</code> if <del>the associated asynchronous state is
already ready</del> <ins><code>operator()</code> has already been called</ins>.
</li>
<li>
<code>no_state</code> if <code>*this</code> has no associated asynchronous state.
</li>
</ul>
</blockquote>
</blockquote>

<p><i>[Adopted at Madrid, 2011-03]</i></p>




<p id="res-2008"><b>Proposed resolution:</b></p>
<ol>
<li>
<p>
Change the first bullet item in 32.10.10.2 <a href="https://wg21.link/futures.task.members">[futures.task.members]</a> p. 17:
</p>

<blockquote><pre>
void operator()(ArgTypes... args);
</pre>
<blockquote>
<p>
15 ...
</p>
<p>
16 ...
</p>
<p>
17 <i>Error conditions:</i>
</p>
<ul>
<li>
<code>promise_already_satisfied</code> if the <del>associated asynchronous state is already 
ready</del><ins>stored task has already been invoked</ins>.
</li>
<li>
<code>no_state</code> if <code>*this</code> has no associated asynchronous state.
</li>
</ul>
</blockquote>
</blockquote>
</li>

<li>
<p>
Change the first bullet item in 32.10.10.2 <a href="https://wg21.link/futures.task.members">[futures.task.members]</a> p. 21:
</p>

<blockquote><pre>
void make_ready_at_thread_exit(ArgTypes... args);
</pre>
<blockquote>
<p>
19 ...
</p>
<p>
20 ...
</p>
<p>
21 <i>Error conditions:</i>
</p>
<ul>
<li>
<code>promise_already_satisfied</code> if the <del>associated asynchronous state already has a stored value or
exception</del><ins>stored task has already been invoked</ins>.
</li>
<li>
<code>no_state</code> if <code>*this</code> has no associated asynchronous state.
</li>
</ul>
</blockquote>
</blockquote>

</li>
</ol>






</body>
</html>
