<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="mpark/wg21" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <meta name="dcterms.date" content="2025-06-19" />
  <title>Make type-erased allocator use in `promise` and `packaged_task`
consistent</title>
  <style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.csl-block{margin-left: 1.5em;}
ul.task-list{list-style: none;}
html { -webkit-text-size-adjust: 100%; }
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ background-color: #f6f8fa; }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span { } 
code span.al { color: #ff0000; } 
code span.an { } 
code span.at { } 
code span.bn { color: #9f6807; } 
code span.bu { color: #9f6807; } 
code span.cf { color: #00607c; } 
code span.ch { color: #9f6807; } 
code span.cn { } 
code span.co { color: #008000; font-style: italic; } 
code span.cv { color: #008000; font-style: italic; } 
code span.do { color: #008000; } 
code span.dt { color: #00607c; } 
code span.dv { color: #9f6807; } 
code span.er { color: #ff0000; font-weight: bold; } 
code span.ex { } 
code span.fl { color: #9f6807; } 
code span.fu { } 
code span.im { } 
code span.in { color: #008000; } 
code span.kw { color: #00607c; } 
code span.op { color: #af1915; } 
code span.ot { } 
code span.pp { color: #6f4e37; } 
code span.re { } 
code span.sc { color: #9f6807; } 
code span.ss { color: #9f6807; } 
code span.st { color: #9f6807; } 
code span.va { } 
code span.vs { color: #9f6807; } 
code span.wa { color: #008000; font-weight: bold; } 
code.diff {color: #898887}
code.diff span.va {color: #006e28}
code.diff span.st {color: #bf0303}
</style>
  <style type="text/css">
body {
margin: 5em;
font-family: serif;

hyphens: auto;
line-height: 1.35;
text-align: justify;
}
@media screen and (max-width: 30em) {
body {
margin: 1.5em;
}
}
div.wrapper {
max-width: 60em;
margin: auto;
}
ul {
list-style-type: none;
padding-left: 2em;
margin-top: -0.2em;
margin-bottom: -0.2em;
}
a {
text-decoration: none;
color: #4183C4;
}
a.hidden_link {
text-decoration: none;
color: inherit;
}
li {
margin-top: 0.6em;
margin-bottom: 0.6em;
}
h1, h2, h3, h4 {
position: relative;
line-height: 1;
}
a.self-link {
position: absolute;
top: 0;
left: calc(-1 * (3.5rem - 26px));
width: calc(3.5rem - 26px);
height: 2em;
text-align: center;
border: none;
transition: opacity .2s;
opacity: .5;
font-family: sans-serif;
font-weight: normal;
font-size: 83%;
}
a.self-link:hover { opacity: 1; }
a.self-link::before { content: "§"; }
ul > li:before {
content: "\2014";
position: absolute;
margin-left: -1.5em;
}
:target { background-color: #C9FBC9; }
:target .codeblock { background-color: #C9FBC9; }
:target ul { background-color: #C9FBC9; }
.abbr_ref { float: right; }
.folded_abbr_ref { float: right; }
:target .folded_abbr_ref { display: none; }
:target .unfolded_abbr_ref { float: right; display: inherit; }
.unfolded_abbr_ref { display: none; }
.secnum { display: inline-block; min-width: 35pt; }
.header-section-number { display: inline-block; min-width: 35pt; }
.annexnum { display: block; }
div.sourceLinkParent {
float: right;
}
a.sourceLink {
position: absolute;
opacity: 0;
margin-left: 10pt;
}
a.sourceLink:hover {
opacity: 1;
}
a.itemDeclLink {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
opacity: 0;
}
a.itemDeclLink:hover { opacity: 1; }
span.marginalizedparent {
position: relative;
left: -5em;
}
li span.marginalizedparent { left: -7em; }
li ul > li span.marginalizedparent { left: -9em; }
li ul > li ul > li span.marginalizedparent { left: -11em; }
li ul > li ul > li ul > li span.marginalizedparent { left: -13em; }
div.footnoteNumberParent {
position: relative;
left: -4.7em;
}
a.marginalized {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
}
a.enumerated_item_num {
position: relative;
left: -3.5em;
display: inline-block;
margin-right: -3em;
text-align: right;
width: 3em;
}
div.para { margin-bottom: 0.6em; margin-top: 0.6em; text-align: justify; }
div.section { text-align: justify; }
div.sentence { display: inline; }
span.indexparent {
display: inline;
position: relative;
float: right;
right: -1em;
}
a.index {
position: absolute;
display: none;
}
a.index:before { content: "⟵"; }

a.index:target {
display: inline;
}
.indexitems {
margin-left: 2em;
text-indent: -2em;
}
div.itemdescr {
margin-left: 3em;
}
.bnf {
font-family: serif;
margin-left: 40pt;
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.ncbnf {
font-family: serif;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
}
.ncsimplebnf {
font-family: serif;
font-style: italic;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
background: inherit; 
}
span.textnormal {
font-style: normal;
font-family: serif;
white-space: normal;
display: inline-block;
}
span.rlap {
display: inline-block;
width: 0px;
}
span.descr { font-style: normal; font-family: serif; }
span.grammarterm { font-style: italic; }
span.term { font-style: italic; }
span.terminal { font-family: monospace; font-style: normal; }
span.nonterminal { font-style: italic; }
span.tcode { font-family: monospace; font-style: normal; }
span.textbf { font-weight: bold; }
span.textsc { font-variant: small-caps; }
a.nontermdef { font-style: italic; font-family: serif; }
span.emph { font-style: italic; }
span.techterm { font-style: italic; }
span.mathit { font-style: italic; }
span.mathsf { font-family: sans-serif; }
span.mathrm { font-family: serif; font-style: normal; }
span.textrm { font-family: serif; }
span.textsl { font-style: italic; }
span.mathtt { font-family: monospace; font-style: normal; }
span.mbox { font-family: serif; font-style: normal; }
span.ungap { display: inline-block; width: 2pt; }
span.textit { font-style: italic; }
span.texttt { font-family: monospace; }
span.tcode_in_codeblock { font-family: monospace; font-style: normal; }
span.phantom { color: white; }

span.math { font-style: normal; }
span.mathblock {
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 1.2em;
margin-bottom: 1.2em;
text-align: center;
}
span.mathalpha {
font-style: italic;
}
span.synopsis {
font-weight: bold;
margin-top: 0.5em;
display: block;
}
span.definition {
font-weight: bold;
display: block;
}
.codeblock {
margin-left: 1.2em;
line-height: 127%;
}
.outputblock {
margin-left: 1.2em;
line-height: 127%;
}
div.itemdecl {
margin-top: 2ex;
}
code.itemdeclcode {
white-space: pre;
display: block;
}
span.textsuperscript {
vertical-align: super;
font-size: smaller;
line-height: 0;
}
.footnotenum { vertical-align: super; font-size: smaller; line-height: 0; }
.footnote {
font-size: small;
margin-left: 2em;
margin-right: 2em;
margin-top: 0.6em;
margin-bottom: 0.6em;
}
div.minipage {
display: inline-block;
margin-right: 3em;
}
div.numberedTable {
text-align: center;
margin: 2em;
}
div.figure {
text-align: center;
margin: 2em;
}
table {
border: 1px solid black;
border-collapse: collapse;
margin-left: auto;
margin-right: auto;
margin-top: 0.8em;
text-align: left;
hyphens: none; 
}
td, th {
padding-left: 1em;
padding-right: 1em;
vertical-align: top;
}
td.empty {
padding: 0px;
padding-left: 1px;
}
td.left {
text-align: left;
}
td.right {
text-align: right;
}
td.center {
text-align: center;
}
td.justify {
text-align: justify;
}
td.border {
border-left: 1px solid black;
}
tr.rowsep, td.cline {
border-top: 1px solid black;
}
tr.even, tr.odd {
border-bottom: 1px solid black;
}
tr.capsep {
border-top: 3px solid black;
border-top-style: double;
}
tr.header {
border-bottom: 3px solid black;
border-bottom-style: double;
}
th {
border-bottom: 1px solid black;
}
span.centry {
font-weight: bold;
}
div.table {
display: block;
margin-left: auto;
margin-right: auto;
text-align: center;
width: 90%;
}
span.indented {
display: block;
margin-left: 2em;
margin-bottom: 1em;
margin-top: 1em;
}
ol.enumeratea { list-style-type: none; background: inherit; }
ol.enumerate { list-style-type: none; background: inherit; }

code.sourceCode > span { display: inline; }
</style>
  <link href="data:image/vnd.microsoft.icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAVoJEAN6CRADegkQAWIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wCCRAAAgkQAAIJEAACCRAAsgkQAvoJEAP+CRAD/gkQA/4JEAP+CRADAgkQALoJEAACCRAAAgkQAAP///wD///8AgkQAAIJEABSCRACSgkQA/IJEAP99PQD/dzMA/3czAP99PQD/gkQA/4JEAPyCRACUgkQAFIJEAAD///8A////AHw+AFiBQwDqgkQA/4BBAP9/PxP/uZd6/9rJtf/bybX/upd7/39AFP+AQQD/gkQA/4FDAOqAQgBc////AP///wDKklv4jlEa/3o7AP+PWC//8+3o///////////////////////z7un/kFox/35AAP+GRwD/mVYA+v///wD///8A0Zpk+NmibP+0d0T/8evj///////+/fv/1sKz/9bCs//9/fr//////+/m2/+NRwL/nloA/5xYAPj///8A////ANKaZPjRmGH/5cKh////////////k149/3UwAP91MQD/lmQ//86rhv+USg3/m1YA/5hSAP+bVgD4////AP///wDSmmT4zpJY/+/bx///////8+TV/8mLT/+TVx//gkIA/5lVAP+VTAD/x6B//7aEVv/JpH7/s39J+P///wD///8A0ppk+M6SWP/u2sf///////Pj1f/Nj1T/2KFs/8mOUv+eWhD/lEsA/8aee/+0glT/x6F7/7J8Rvj///8A////ANKaZPjRmGH/48Cf///////+/v7/2qt//82PVP/OkFX/37KJ/86siv+USg7/mVQA/5hRAP+bVgD4////AP///wDSmmT40ppk/9CVXP/69O////////7+/v/x4M//8d/P//7+/f//////9u7n/6tnJf+XUgD/nFgA+P///wD///8A0ppk+NKaZP/RmWL/1qNy//r07///////////////////////+vXw/9akdP/Wnmn/y5FY/6JfFvj///8A////ANKaZFTSmmTo0ppk/9GYYv/Ql1//5cWm//Hg0P/x4ND/5cWm/9GXYP/RmGH/0ppk/9KaZOjVnmpY////AP///wDSmmQA0ppkEtKaZI7SmmT60ppk/9CWX//OkVb/zpFW/9CWX//SmmT/0ppk/NKaZJDSmmQS0ppkAP///wD///8A0ppkANKaZADSmmQA0ppkKtKaZLrSmmT/0ppk/9KaZP/SmmT/0ppkvNKaZCrSmmQA0ppkANKaZAD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkUtKaZNzSmmTc0ppkVNKaZADSmmQA0ppkANKaZADSmmQA////AP5/AAD4HwAA4AcAAMADAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADgBwAA+B8AAP5/AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAyCRACMgkQA6oJEAOqCRACQgkQAEIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRABigkQA5oJEAP+CRAD/gkQA/4JEAP+CRADqgkQAZoJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAA4gkQAwoJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQAxIJEADyCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAP///wD///8A////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAWgkQAmIJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAJyCRAAYgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAdIJEAPCCRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAPSCRAB4gkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQASoJEANKCRAD/gkQA/4JEAP+CRAD/g0YA/39AAP9zLgD/bSQA/2shAP9rIQD/bSQA/3MuAP9/PwD/g0YA/4JEAP+CRAD/gkQA/4JEAP+CRADUgkQAToJEAACCRAAAgkQAAP///wD///8A////AP///wB+PwAAgkUAIoJEAKiCRAD/gkQA/4JEAP+CRAD/hEcA/4BBAP9sIwD/dTAA/5RfKv+viF7/vp56/76ee/+wiF7/lWAr/3YxAP9sIwD/f0AA/4RHAP+CRAD/gkQA/4JEAP+CRAD/gkQArIJEACaBQwAA////AP///wD///8A////AIBCAEBzNAD6f0EA/4NFAP+CRAD/gkQA/4VIAP92MwD/bSUA/6N1Tv/ezsL/////////////////////////////////38/D/6V3Uv9uJgD/dTEA/4VJAP+CRAD/gkQA/4JEAP+BQwD/fUAA/4FDAEj///8A////AP///wD///8AzJRd5qBlKf91NgD/dDUA/4JEAP+FSQD/cy4A/3YyAP/PuKP//////////////////////////////////////////////////////9K7qP94NQD/ciwA/4VJAP+CRAD/fkEA/35BAP+LSwD/mlYA6v///wD///8A////AP///wDdpnL/4qx3/8KJUv+PUhf/cTMA/3AsAP90LgD/4dK+/////////////////////////////////////////////////////////////////+TYxf91MAD/dTIA/31CAP+GRwD/llQA/6FcAP+gWwD8////AP///wD///8A////ANGZY/LSm2X/4ap3/92mcP+wdT3/byQA/8mwj////////////////////////////////////////////////////////////////////////////+LYxv9zLgP/jUoA/59bAP+hXAD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/RmWL/1p9q/9ubXv/XqXj////////////////////////////7+fD/vZyG/6BxS/+gcUr/vJuE//r37f//////////////////////3MOr/5dQBf+dVQD/nVkA/5xYAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmWP/yohJ//jo2P//////////////////////4NTG/4JDFf9lGAD/bSQA/20kAP9kGAD/fz8S/+Xb0f//////5NG9/6txN/+LOgD/m1QA/51aAP+cWAD/m1cA/5xYAP+cWADy////AP///wD///8A////ANKaZPLSmmT/0ppk/8+TWf/Unmv//v37//////////////////////+TWRr/VwsA/35AAP+ERgD/g0UA/4JGAP9lHgD/kFga/8KXX/+TRwD/jT4A/49CAP+VTQD/n10A/5xYAP+OQQD/lk4A/55cAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/y4tO/92yiP//////////////////////8NnE/8eCQP+rcTT/ez0A/3IyAP98PgD/gEMA/5FSAP+USwD/jj8A/5lUAP+JNwD/yqV2/694Mf+HNQD/jkAA/82rf/+laBj/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/LiUr/4byY///////////////////////gupX/0I5P/+Wuev/Lklz/l1sj/308AP+QSwD/ol0A/59aAP+aVQD/k0oA/8yoh///////+fXv/6pwO//Lp3v///////Pr4f+oay7y////AP///wD///8A////ANKaZPLSmmT/0ppk/8uJSv/hvJj//////////////////////+G7l//Jhkb/0ppk/96nc//fqXX/x4xO/6dkFP+QSQD/llEA/5xXAP+USgD/yaOA///////38uv/qG05/8ijdv//////8efb/6ZpLPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/zIxO/9yxh///////////////////////7dbA/8iEQf/Sm2X/0Zlj/9ScZv/eqHf/2KJv/7yAQf+XTgD/iToA/5lSAP+JNgD/yKFv/611LP+HNQD/jT8A/8qmeP+kZRT/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/Pk1n/1J5q//78+//////////////////+/fv/1aFv/8iEQv/Tm2b/0ppl/9GZY//Wn2z/1pZc/9eldf/Bl2b/kUcA/4w9AP+OQAD/lUwA/59eAP+cWQD/jT8A/5ZOAP+eXADy////AP///wD///8A////ANKaZPLSmmT/0ppk/9KZY//KiEn/8d/P///////////////////////47+f/05tm/8iCP//KiEj/yohJ/8eCP//RmGH//vfy///////n1sP/rXQ7/4k4AP+TTAD/nVoA/5xYAP+cVwD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/0ptl/8uLTf/aq37////////////////////////////+/fz/6c2y/961jv/etY7/6Myx//78+v//////////////////////3MWv/5xXD/+ORAD/mFQA/51ZAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmmT/0ppk/8mFRP/s1b//////////////////////////////////////////////////////////////////////////////+PD/0JFU/7NzMv+WUQD/kUsA/5tXAP+dWQDy////AP///wD///8A////ANKaZP/SmmT/0ppk/9KaZP/Sm2X/z5NZ/8yMT//z5NX/////////////////////////////////////////////////////////////////9Ofa/8yNUP/UmGH/36p5/8yTWv+qaSD/kksA/5ROAPz///8A////AP///wD///8A0ppk5NKaZP/SmmT/0ppk/9KaZP/TnGf/zY9T/82OUv/t1sD//////////////////////////////////////////////////////+7Yw//OkFX/zI5R/9OcZ//SmmP/26V0/9ymdf/BhUf/ol8R6P///wD///8A////AP///wDSmmQ80ppk9tKaZP/SmmT/0ppk/9KaZP/TnGj/zpFW/8qJSv/dson/8uHS//////////////////////////////////Lj0//etIv/y4lL/86QVf/TnGj/0ppk/9KaZP/RmWP/05xn/9ymdfjUnWdC////AP///wD///8A////ANKaZADSmmQc0ppkotKaZP/SmmT/0ppk/9KaZP/Tm2b/0Zli/8qJSf/NjlH/16Z3/+G8mP/myKr/5siq/+G8mP/Xp3f/zY5S/8qISf/RmGH/05tm/9KaZP/SmmT/0ppk/9KaZP/SmmSm0pljINWdaQD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkQtKaZMrSmmT/0ppk/9KaZP/SmmT/0ptl/9GYYf/Nj1P/y4lL/8qISP/KiEj/y4lK/82PU//RmGH/0ptl/9KaZP/SmmT/0ppk/9KaZP/SmmTO0ppkRtKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZGzSmmTu0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmTw0ppkcNKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZBLSmmSQ0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppklNKaZBTSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQy0ppkutKaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppkvtKaZDbSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkXNKaZODSmmT/0ppk/9KaZP/SmmT/0ppk5NKaZGDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkBtKaZIbSmmTo0ppk6tKaZIrSmmQK0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP/8P///+B///+AH//+AAf//AAD//AAAP/AAAA/gAAAHwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA+AAAAfwAAAP/AAAP/8AAP//gAH//+AH///4H////D//" rel="icon" />
  
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
</head>
<body>
<div class="wrapper">
<header id="title-block-header">
<h1 class="title" style="text-align:center">Make type-erased allocator
use in <code class="sourceCode cpp">promise</code> and
<code class="sourceCode cpp">packaged_task</code> consistent</h1>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P3503R3</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2025-06-19</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Project:</td>
    <td>Programming Language C++</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Audience:</td>
    <td>
      Library<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Nicolas Morales<br>&lt;<a href="mailto:nmmoral@sandia.gov" class="email">nmmoral@sandia.gov</a>&gt;<br>
      Jonathan Wakely<br>&lt;<a href="mailto:cxx@kayari.org" class="email">cxx@kayari.org</a>&gt;<br>
    </td>
  </tr>
</table>
</header>
<div style="clear:both">
<div id="TOC" role="doc-toc">
<h1 id="toctitle">Contents</h1>
<ul>
<li><a href="#revision-history" id="toc-revision-history"><span class="toc-section-number">1</span> Revision History</a>
<ul>
<li><a href="#p3503r3-2025-06-sofia-lwg-review" id="toc-p3503r3-2025-06-sofia-lwg-review"><span class="toc-section-number">1.1</span> P3503R3: 2025-06 Sofia LWG
Review</a></li>
<li><a href="#p3503r2-2025-03-post-hagenberg-mailing" id="toc-p3503r2-2025-03-post-hagenberg-mailing"><span class="toc-section-number">1.2</span> P3503R2: 2025-03 Post-Hagenberg
Mailing</a></li>
<li><a href="#p3503r1-2025-03-post-hagenberg-mailing" id="toc-p3503r1-2025-03-post-hagenberg-mailing"><span class="toc-section-number">1.3</span> P3503R1: 2025-03 Post-Hagenberg
Mailing</a></li>
<li><a href="#p3503r0-2024-12-post-wrocław-mailing" id="toc-p3503r0-2024-12-post-wrocław-mailing"><span class="toc-section-number">1.4</span> P3503R0: 2024-12 Post-Wrocław
Mailing</a></li>
</ul></li>
<li><a href="#motivation-and-background" id="toc-motivation-and-background"><span class="toc-section-number">2</span> Motivation and Background</a></li>
<li><a href="#design" id="toc-design"><span class="toc-section-number">3</span> Design</a>
<ul>
<li><a href="#alternatives" id="toc-alternatives"><span class="toc-section-number">3.1</span> Alternatives</a></li>
</ul></li>
<li><a href="#wording" id="toc-wording"><span class="toc-section-number">4</span> Wording</a></li>
<li><a href="#acknowledgments" id="toc-acknowledgments"><span class="toc-section-number">5</span> Acknowledgments</a></li>
<li><a href="#bibliography" id="toc-bibliography"><span class="toc-section-number">6</span> References</a></li>
</ul>
</div>
<h1 data-number="1" id="revision-history"><span class="header-section-number">1</span> Revision History<a href="#revision-history" class="self-link"></a></h1>
<h2 data-number="1.1" id="p3503r3-2025-06-sofia-lwg-review"><span class="header-section-number">1.1</span> P3503R3: 2025-06 Sofia LWG
Review<a href="#p3503r3-2025-06-sofia-lwg-review" class="self-link"></a></h2>
<ul>
<li>Fix wording after LWG review.</li>
</ul>
<h2 data-number="1.2" id="p3503r2-2025-03-post-hagenberg-mailing"><span class="header-section-number">1.2</span> P3503R2: 2025-03 Post-Hagenberg
Mailing<a href="#p3503r2-2025-03-post-hagenberg-mailing" class="self-link"></a></h2>
<ul>
<li>Minor markup fixes missed earlier</li>
</ul>
<h2 data-number="1.3" id="p3503r1-2025-03-post-hagenberg-mailing"><span class="header-section-number">1.3</span> P3503R1: 2025-03 Post-Hagenberg
Mailing<a href="#p3503r1-2025-03-post-hagenberg-mailing" class="self-link"></a></h2>
<ul>
<li>Forwarded by LEWG to LWG after a reflector review with 15 votes, no
objections</li>
<li>Fix wording after mailing list review</li>
</ul>
<h2 data-number="1.4" id="p3503r0-2024-12-post-wrocław-mailing"><span class="header-section-number">1.4</span> P3503R0: 2024-12 Post-Wrocław
Mailing<a href="#p3503r0-2024-12-post-wrocław-mailing" class="self-link"></a></h2>
<ul>
<li>Initial paper revision</li>
</ul>
<h1 data-number="2" id="motivation-and-background"><span class="header-section-number">2</span> Motivation and Background<a href="#motivation-and-background" class="self-link"></a></h1>
<p><span class="citation" data-cites="LWG2095">[<a href="https://wg21.link/lwg2095" role="doc-biblioref">LWG2095</a>]</span> points out inconsistencies in
the API of
<code class="sourceCode cpp">std<span class="op">::</span>promise</code>;
namely that <code class="sourceCode cpp">uses_allocator<span class="op">&lt;</span>promise<span class="op">&lt;</span>R<span class="op">&gt;</span>, A<span class="op">&gt;::</span>value</code>
is specified to be true in <span>32.10.6
<a href="https://wg21.link/futures.promise">[futures.promise]</a></span>,
yet is missing the appropriate constructor taking an rvalue of
promise.</p>
<p>This example shows the problem <a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a>:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">using</span> prom <span class="op">=</span> promise<span class="op">&lt;</span><span class="dt">void</span><span class="op">&gt;</span>;</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>tuple<span class="op">&lt;</span>prom<span class="op">&gt;</span> t1<span class="op">{</span> allocator_arg, a <span class="op">}</span>;</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a>tuple<span class="op">&lt;</span>prom<span class="op">&gt;</span> t2<span class="op">{</span> allocator_arg, a, prom<span class="op">{}</span> <span class="op">}</span>; <span class="co">// ill-formed</span></span></code></pre></div>
<p>Meanwhile, <span class="citation" data-cites="LWG2921">[<a href="https://wg21.link/lwg2921" role="doc-biblioref">LWG2921</a>]</span> and <span class="citation" data-cites="LWG2976">[<a href="https://wg21.link/lwg2976" role="doc-biblioref">LWG2976</a>]</span> removed the allocator
constructors from <code class="sourceCode cpp">packaged_task</code>; a
followup issue <span class="citation" data-cites="LWG3003">[<a href="https://wg21.link/lwg3003" role="doc-biblioref">LWG3003</a>]</span> originally suggested removing
them from <code class="sourceCode cpp">promise</code>. Part of the
motivation for this was that although the original reasoning for
removing allocator constructors from
<code class="sourceCode cpp">packaged_task</code> was incorrect (to keep
the design parallels between <code class="sourceCode cpp">std<span class="op">::</span>packaged_task</code>
and <code class="sourceCode cpp">std<span class="op">::</span>function</code>),
LWG decided to keep this resolution as it was a response to an NB
comment.</p>
<p>In Varna, LEWG wanted a resolution to this issue that keeps the
constructor in
<code class="sourceCode cpp">std<span class="op">::</span>promise</code>
as it is actually useful (and removing it would break existing code
regardless). Furthermore, LEWG indicated that to resolve <span class="citation" data-cites="LWG2095">[<a href="https://wg21.link/lwg2095" role="doc-biblioref">LWG2095</a>]</span> that the the
<code class="sourceCode cpp">uses_allocator</code> specialization should
be removed from
<code class="sourceCode cpp">std<span class="op">::</span>promise</code>,
since the extra parameter to the moving constructor would have been
ignored anyway. Finally, the constructors incorrectly removed from <code class="sourceCode cpp">std<span class="op">::</span>packaged_task</code>
would be restored, though
<code class="sourceCode cpp">uses_allocator</code> would not be re-added
for <code class="sourceCode cpp">std<span class="op">::</span>packaged_task</code>.</p>
<p>Re-adding the constructor from <code class="sourceCode cpp">std<span class="op">::</span>packaged_task</code>
re-raises another issue (<span class="citation" data-cites="LWG2245">[<a href="https://wg21.link/lwg2245" role="doc-biblioref">LWG2245</a>]</span>) that was closed with the
resolution of <span class="citation" data-cites="LWG2921">[<a href="https://wg21.link/lwg2921" role="doc-biblioref">LWG2921</a>]</span>. Basically, <code class="sourceCode cpp">packaged_task<span class="op">::</span>reset<span class="op">()</span></code>
did not allow a user to supply an allocator even though an allocator was
used. In the issue discussion it was decided that the best resolution
would be for using the allocator that was provided to <code class="sourceCode cpp">std<span class="op">::</span>packaged_task</code>
in construction, rather than adding an additional overload to reset that
takes an allocator.</p>
<p>Also in Varna, it was resolved to write a paper to introduce these
changes. This paper (I suppose) never materialized, and <span class="citation" data-cites="LWG2095">[<a href="https://wg21.link/lwg2095" role="doc-biblioref">LWG2095</a>]</span> and <span class="citation" data-cites="LWG3003">[<a href="https://wg21.link/lwg3003" role="doc-biblioref">LWG3003</a>]</span> were brought before LEWG in
Wroclaw in 2024. This paper is intended to bring together the resolution
and issues into a single paper for voting on by LEWG.</p>
<h1 data-number="3" id="design"><span class="header-section-number">3</span> Design<a href="#design" class="self-link"></a></h1>
<p>The design of this paper is intended to resolve the LWG issues as
follows:</p>
<ol type="1">
<li>Resolve <span class="citation" data-cites="LWG2095">[<a href="https://wg21.link/lwg2095" role="doc-biblioref">LWG2095</a>]</span> by removing the <code class="sourceCode cpp">std<span class="op">::</span>uses_allocator</code>
specialization for
<code class="sourceCode cpp">std<span class="op">::</span>promise</code>,
but do not remove the existing constructor.</li>
<li>Resolve <span class="citation" data-cites="LWG3003">[<a href="https://wg21.link/lwg3003" role="doc-biblioref">LWG3003</a>]</span> by re-introducing the
previously removed constructors</li>
<li>Avoid reintroducing a similar bug to <span class="citation" data-cites="LWG2095">[<a href="https://wg21.link/lwg2095" role="doc-biblioref">LWG2095</a>]</span> by not re-adding a <code class="sourceCode cpp">std<span class="op">::</span>uses_allocator</code>
specialization to <code class="sourceCode cpp">std<span class="op">::</span>packaged_task</code></li>
<li>Ensure that <code class="sourceCode cpp">std<span class="op">::</span>packaged_task<span class="op">::</span>reset<span class="op">()</span></code>
uses the allocator it was constructed with to create the new shared
state.</li>
</ol>
<p>This paper adopts the wording changes in the final suggested revision
to <span class="citation" data-cites="LWG3003">[<a href="https://wg21.link/lwg3003" role="doc-biblioref">LWG3003</a>]</span>, rebased on the latest draft at
the time of this writing (<span class="citation" data-cites="N4993">[<a href="https://wg21.link/n4993" role="doc-biblioref">N4993</a>]</span>).</p>
<h2 data-number="3.1" id="alternatives"><span class="header-section-number">3.1</span> Alternatives<a href="#alternatives" class="self-link"></a></h2>
<p>There were two variant designs suggested in these issues, but were
rejected in favor of other designs and I wouldn’t favor adopting
them:</p>
<ol type="1">
<li>Add a new constructor to
<code class="sourceCode cpp">std<span class="op">::</span>promise</code>
(and <code class="sourceCode cpp">std<span class="op">::</span>packaged_task</code>)
that takes an allocator and rvalue reference. This was not the
alternative that LEWG decided on in Varna. This is the original
resolution to <span class="citation" data-cites="LWG2095">[<a href="https://wg21.link/lwg2095" role="doc-biblioref">LWG2095</a>]</span> that was abandoned.</li>
<li>Add a new overload for <code class="sourceCode cpp">std<span class="op">::</span>packaged_task<span class="op">::</span>reset<span class="op">()</span></code>
that takes an allocator. I’m not sure how useful this would actually be
to use a different allocator for the new shared object.</li>
</ol>
<h1 data-number="4" id="wording"><span class="header-section-number">4</span> Wording<a href="#wording" class="self-link"></a></h1>
<p>Modify <span>32.10.6
<a href="https://wg21.link/futures.promise">[futures.promise]</a></span>
as indicated:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">template&lt;class R, class Alloc&gt;</code></span></del></span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">struct uses_allocator&lt;promise&lt;R&gt;, Alloc&gt;;</code></span></del></span></span></code></pre></div>
<p>[…]</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">template&lt;class R, class Alloc&gt;</code></span></del></span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">struct uses_allocator&lt;promise&lt;R&gt;, Alloc&gt;</code></span></del></span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">: true_type { };</code></span></del></span></span></code></pre></div>
<p><span class="rm" style="color: #bf0303"><del><em>Preconditions:</em>
Alloc meets the <em>Cpp17Allocator</em> requirements (<span>16.4.4.6.1
<a href="https://wg21.link/allocator.requirements.general">[allocator.requirements.general]</a></span>).</del></span></p>
<p>Modify <span>32.10.10.1
<a href="https://wg21.link/futures.task.general">[futures.task.general]</a></span>
as indicated:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> R, <span class="kw">class</span><span class="op">...</span> ArgTypes<span class="op">&gt;</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="kw">class</span> packaged_task<span class="op">&lt;</span>R<span class="op">(</span>ArgTypes<span class="op">...)&gt;</span> <span class="op">{</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span><span class="op">:</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a>  <span class="co">// construction and destruction</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a>  packaged_task<span class="op">()</span> <span class="kw">noexcept</span>;</span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a>  <span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> F<span class="op">&gt;</span></span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a>    <span class="kw">explicit</span> packaged_task<span class="op">(</span>F<span class="op">&amp;&amp;</span> f<span class="op">)</span>;</span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">template&lt;class F, class Allocator&gt;</code></span></ins></span></span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">explicit packaged_task(allocator_arg_t, const Allocator&amp; a, F&amp;&amp; f);</code></span></ins></span></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a>  <span class="op">~</span>packaged_task<span class="op">()</span>;</span></code></pre></div>
<p>Modify <span>32.10.10.2
<a href="https://wg21.link/futures.task.members">[futures.task.members]</a></span>
as indicated:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="kw">template</span><span class="op">&lt;</span><span class="kw">class</span> F<span class="op">&gt;</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">explicit</span> packaged_task<span class="op">(</span>F<span class="op">&amp;&amp;</span> f<span class="op">)</span>;</span></code></pre></div>
<p><span class="add" style="color: #006e28"><ins><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> Equivalent to <span><code class="sourceCode default">packaged_task(allocator_arg, allocator&lt;int&gt;(), std::forward&lt;F&gt;(f))</code></span>.</ins></span></p>
<blockquote>
<p>[<em>Drafting note:</em> Uses of <code class="sourceCode cpp">allocator<span class="op">&lt;</span><span class="dt">int</span><span class="op">&gt;</span></code>
and <code class="sourceCode cpp">allocator<span class="op">&lt;</span><em>unspecified</em><span class="op">&gt;</span></code>
are not observable so this constructor can be implemented without
delegating to the other constructor and without using
<code class="sourceCode cpp">allocator</code>.]</p>
</blockquote>
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">template&lt;class F, class Allocator&gt;</code></span></ins></span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">packaged_task(allocator_arg_t, const Allocator&amp; a, F&amp;&amp; f);</code></span></ins></span></span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Constraints:</em> <code class="sourceCode cpp">remove_cvref_t<span class="op">&lt;</span>F<span class="op">&gt;</span></code>
is not the same type as <code class="sourceCode cpp">packaged_task<span class="op">&lt;</span>R<span class="op">(</span>ArgTypes<span class="op">...)&gt;</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em>Mandates:</em> <code class="sourceCode cpp">is_invocable_r_v<span class="op">&lt;</span>R, F<span class="op">&amp;</span>, ArgTypes<span class="op">...&gt;</span></code>
is <code class="sourceCode cpp"><span class="kw">true</span></code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Preconditions:</em> Invoking a copy of
<code class="sourceCode cpp">f</code> behaves the same as invoking
<code class="sourceCode cpp">f</code>. <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">Allocator</code></span>
meets the <em>Cpp17Allocator</em> requirements (16.4.4.6.1
<span>16.4.4.6.1
<a href="https://wg21.link/allocator.requirements.general">[allocator.requirements.general]</a></span>).</ins></span></p>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
<em>Effects:</em> <span class="add" style="color: #006e28"><ins>Let
<span><code class="sourceCode default">A2</code></span> be <span><code class="sourceCode default">allocator_traits&lt;Allocator&gt;::rebind_alloc&lt;<em>unspecified</em>&gt;</code></span>
and let <span><code class="sourceCode default">a2</code></span> be an
object of type <span><code class="sourceCode default">A2</code></span>
initialized with
<span><code class="sourceCode default">A2(a)</code></span>.</ins></span>
Constructs a new <code class="sourceCode cpp">packaged_task</code>
object with a shared state and initializes the object’s stored task with
<code class="sourceCode cpp">std​<span class="op">::</span>​forward<span class="op">&lt;</span>F<span class="op">&gt;(</span>f<span class="op">)</span></code>.
<span class="add" style="color: #006e28"><ins>Uses
<span><code class="sourceCode default">a2</code></span> to allocate
storage for the shared state and stores a copy of
<span><code class="sourceCode default">a2</code></span> in the shared
state.</ins></span></p>
<p><span class="marginalizedparent"><a class="marginalized">6</a></span>
<em>Throws:</em> <span class="rm" style="color: #bf0303"><del>Any
exceptions thrown by the copy or move constructor of
<span><code class="sourceCode default">f</code></span>, or
<span><code class="sourceCode default">bad_alloc</code></span> if memory
for the internal data structures cannot be allocated.</del></span> <span class="add" style="color: #006e28"><ins>Any exceptions thrown by the
initialization of the stored task. If storage for the shared state
cannot be allocated, any exception thrown by
<span><code class="sourceCode default">A2::allocate</code></span>.</ins></span></p>
<p>…</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="dt">void</span> reset<span class="op">()</span>;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">26</a></span>
<em>Effects:</em> <span class="rm" style="color: #bf0303"><del>As
if</del></span> <span class="add" style="color: #006e28"><ins>Equivalent
to:</ins></span></p>
<div class="sourceCode" id="cb8"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">if (!valid())</code></span></ins></span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">throw future_error(future_errc::no_state);</code></span></ins></span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a><span class="op">*</span><span class="kw">this</span> <span class="op">=</span> packaged_task<span class="op">(</span><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">allocator_arg, a,</code></span></ins></span>std​<span class="op">::</span>​move<span class="op">(</span>f<span class="op">))</span><span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">,</code></span></del></span><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">;</code></span></ins></span></span></code></pre></div>
<blockquote>
<p>[<em>Drafting note:</em> the existing text is reformatted from a
single line to use a codeblock.]</p>
</blockquote>
<p>where <code class="sourceCode cpp">f</code> is the task stored in
<code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>
<span class="add" style="color: #006e28"><ins>and
<span><code class="sourceCode default">a</code></span> is the allocator
stored in the shared state</ins></span>.</p>
<p>[<em>Note 2:</em> This constructs a new shared state for <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>.
The old state is abandoned (<span>32.10.5
<a href="https://wg21.link/futures.state">[futures.state]</a></span>). —
<em>end note</em>]</p>
<p><span class="marginalizedparent"><a class="marginalized">27</a></span><em>Throws:</em></p>
<p><span class="rm" style="color: #bf0303"><del><span class="marginalizedparent"><a class="marginalized">(27.1)</a></span> —
<span><code class="sourceCode default">bad_alloc</code></span> if memory
for the new shared state cannot be allocated.</del></span></p>
<p><span class="marginalizedparent"><a class="marginalized">(27.2)</a></span> —
Any exception thrown by the <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">packaged_task</code></span>
constructor</ins></span><span class="rm" style="color: #bf0303"><del>move constructor of the task stored in the
shared state</del></span>.</p>
<p><span class="marginalizedparent"><a class="marginalized">(27.3)</a></span> —
<code class="sourceCode cpp">future_error</code> with an error condition
of <code class="sourceCode cpp">no_state</code> if <code class="sourceCode cpp"><span class="op">*</span><span class="kw">this</span></code>
has no shared state.</p>
<h1 data-number="5" id="acknowledgments"><span class="header-section-number">5</span> Acknowledgments<a href="#acknowledgments" class="self-link"></a></h1>
<p>Sandia National Laboratories is a multimission laboratory managed and
operated by National Technology &amp; Engineering Solutions of Sandia,
LLC, a wholly owned subsidiary of Honeywell International Inc., for the
U.S. Department of Energy’s National Nuclear Security Administration
under contract DE-NA0003525. This paper describes objective technical
results and analysis. Any subjective views or opinions that might be
expressed in the paper do not necessarily represent the views of the
U.S. Department of Energy or the United States Government.</p>
<h1 data-number="6" id="bibliography"><span class="header-section-number">6</span> References<a href="#bibliography" class="self-link"></a></h1>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="1" role="list">
<div id="ref-LWG2095" class="csl-entry" role="listitem">
[LWG2095] Jonathan Wakely. promise and packaged_task missing
constructors needed for uses-allocator construction. <a href="https://wg21.link/lwg2095"><div class="csl-block">https://wg21.link/lwg2095</div></a>
</div>
<div id="ref-LWG2245" class="csl-entry" role="listitem">
[LWG2245] Jonathan Wakely. packaged_task::reset() memory allocation. <a href="https://wg21.link/lwg2245"><div class="csl-block">https://wg21.link/lwg2245</div></a>
</div>
<div id="ref-LWG2921" class="csl-entry" role="listitem">
[LWG2921] United States. packaged_task and type-erased allocators. <a href="https://wg21.link/lwg2921"><div class="csl-block">https://wg21.link/lwg2921</div></a>
</div>
<div id="ref-LWG2976" class="csl-entry" role="listitem">
[LWG2976] Tim Song. Dangling uses_allocator specialization for
packaged_task. <a href="https://wg21.link/lwg2976"><div class="csl-block">https://wg21.link/lwg2976</div></a>
</div>
<div id="ref-LWG3003" class="csl-entry" role="listitem">
[LWG3003] Billy O’Neal III. &lt;future&gt; still has type-erased
allocators in promise. <a href="https://wg21.link/lwg3003"><div class="csl-block">https://wg21.link/lwg3003</div></a>
</div>
<div id="ref-N4993" class="csl-entry" role="listitem">
[N4993] Thomas Köppe. 2024-10-16. Working Draft, Programming Languages —
C++. <a href="https://wg21.link/n4993"><div class="csl-block">https://wg21.link/n4993</div></a>
</div>
</div>
<section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes">
<hr />
<ol>
<li id="fn1"><p>This example does compile with
<code class="sourceCode cpp">libstdc<span class="op">++</span></code>
because it preemptively incorporates a fix to the problem.<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
</div>
</div>
</body>
</html>
