<!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-09-01" />
  <title>Add `scope_association` concept to P3149</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;}
      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 { } /* Normal */
      code span.al { color: #ff0000; } /* Alert */
      code span.an { } /* Annotation */
      code span.at { } /* Attribute */
      code span.bn { color: #9f6807; } /* BaseN */
      code span.bu { color: #9f6807; } /* BuiltIn */
      code span.cf { color: #00607c; } /* ControlFlow */
      code span.ch { color: #9f6807; } /* Char */
      code span.cn { } /* Constant */
      code span.co { color: #008000; font-style: italic; } /* Comment */
      code span.cv { color: #008000; font-style: italic; } /* CommentVar */
      code span.do { color: #008000; } /* Documentation */
      code span.dt { color: #00607c; } /* DataType */
      code span.dv { color: #9f6807; } /* DecVal */
      code span.er { color: #ff0000; font-weight: bold; } /* Error */
      code span.ex { } /* Extension */
      code span.fl { color: #9f6807; } /* Float */
      code span.fu { } /* Function */
      code span.im { } /* Import */
      code span.in { color: #008000; } /* Information */
      code span.kw { color: #00607c; } /* Keyword */
      code span.op { color: #af1915; } /* Operator */
      code span.ot { } /* Other */
      code span.pp { color: #6f4e37; } /* Preprocessor */
      code span.re { } /* RegionMarker */
      code span.sc { color: #9f6807; } /* SpecialChar */
      code span.ss { color: #9f6807; } /* SpecialString */
      code span.st { color: #9f6807; } /* String */
      code span.va { } /* Variable */
      code span.vs { color: #9f6807; } /* VerbatimString */
      code span.wa { color: #008000; font-weight: bold; } /* Warning */
      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/x-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">Add
<code class="sourceCode default">scope_association</code> concept to
P3149</h1>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P3815R0</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2025-09-01</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>
      LEWG Library Evolution Working Group<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Ian Petersen<br>&lt;<a href="mailto:ispeters@gmail.com" class="email">ispeters@gmail.com</a>&gt;<br>
      Jessica Wong<br>&lt;<a href="mailto:jesswong2011@gmail.com" class="email">jesswong2011@gmail.com</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="#changes" id="toc-changes"><span class="toc-section-number">1</span> Changes<span></span></a>
<ul>
<li><a href="#r0" id="toc-r0"><span class="toc-section-number">1.1</span> R0<span></span></a></li>
</ul></li>
<li><a href="#background-and-motivation" id="toc-background-and-motivation"><span class="toc-section-number">2</span> Background and
Motivation<span></span></a>
<ul>
<li><a href="#executionspawn" id="toc-executionspawn"><span class="toc-section-number">2.1</span>
execution::spawn<span></span></a></li>
<li><a href="#executionassociate" id="toc-executionassociate"><span class="toc-section-number">2.2</span>
execution::associate<span></span></a></li>
</ul></li>
<li><a href="#proposal" id="toc-proposal"><span class="toc-section-number">3</span> Proposal<span></span></a>
<ul>
<li><a href="#executionscope_token" id="toc-executionscope_token"><span class="toc-section-number">3.1</span>
<code class="sourceCode default">execution::scope_token</code><span></span></a></li>
<li><a href="#executionassociate-1" id="toc-executionassociate-1"><span class="toc-section-number">3.2</span>
<code class="sourceCode default">execution::associate</code><span></span></a></li>
<li><a href="#executionspawn-1" id="toc-executionspawn-1"><span class="toc-section-number">3.3</span>
<code class="sourceCode default">execution::spawn</code><span></span></a></li>
<li><a href="#executionspawn_future" id="toc-executionspawn_future"><span class="toc-section-number">3.4</span>
<code class="sourceCode default">execution::spawn_future</code><span></span></a></li>
<li><a href="#executionsimple_counting_scope" id="toc-executionsimple_counting_scope"><span class="toc-section-number">3.5</span>
<code class="sourceCode default">execution::simple_counting_scope</code><span></span></a></li>
<li><a href="#executioncounting_scope" id="toc-executioncounting_scope"><span class="toc-section-number">3.6</span>
<code class="sourceCode default">execution::counting_scope</code><span></span></a></li>
</ul></li>
<li><a href="#wording" id="toc-wording"><span class="toc-section-number">4</span> Wording<span></span></a>
<ul>
<li><a href="#header-execution-synopsis-execution.syn" id="toc-header-execution-synopsis-execution.syn"><span class="toc-section-number">4.1</span> Header
<code class="sourceCode default">&lt;execution&gt;</code> synopsis
<span>33.4
<span>[execution.syn]</span></span><span></span></a></li>
<li><a href="#executionassociate-2" id="toc-executionassociate-2"><span class="toc-section-number">4.2</span>
<code class="sourceCode default">execution::associate</code><span></span></a></li>
<li><a href="#executionspawn_future-1" id="toc-executionspawn_future-1"><span class="toc-section-number">4.3</span>
<code class="sourceCode default">execution::spawn_future</code><span></span></a></li>
<li><a href="#executionspawn-2" id="toc-executionspawn-2"><span class="toc-section-number">4.4</span>
<code class="sourceCode default">execution::spawn</code><span></span></a></li>
<li><a href="#async-scope-concepts" id="toc-async-scope-concepts"><span class="toc-section-number">4.5</span> Async scope
concepts<span></span></a></li>
<li><a href="#executionsimple_counting_scope-and-executioncounting_scope" id="toc-executionsimple_counting_scope-and-executioncounting_scope"><span class="toc-section-number">4.6</span>
<code class="sourceCode default">execution::simple_counting_scope</code>
and
<code class="sourceCode default">execution::counting_scope</code><span></span></a></li>
</ul></li>
<li><a href="#bibliography" id="toc-bibliography"><span class="toc-section-number">5</span> References<span></span></a></li>
</ul>
</div>
<h1 data-number="1" id="changes"><span class="header-section-number">1</span> Changes<a href="#changes" class="self-link"></a></h1>
<h2 data-number="1.1" id="r0"><span class="header-section-number">1.1</span> R0<a href="#r0" class="self-link"></a></h2>
<ul>
<li>First revision</li>
</ul>
<h1 data-number="2" id="background-and-motivation"><span class="header-section-number">2</span> Background and Motivation<a href="#background-and-motivation" class="self-link"></a></h1>
<p><span class="citation" data-cites="P3149R11">[<a href="#ref-P3149R11" role="doc-biblioref">P3149R11</a>]</span> was approved for C++26 by
WG21. The paper introduces two scope types,
<code class="sourceCode default">simple_counting_scope</code> and
<code class="sourceCode default">counting_scope</code>, along with
several basis operations, including
<code class="sourceCode default">associate</code>,
<code class="sourceCode default">spawn</code>, and
<code class="sourceCode default">spawn_future</code>. In R11, the
example implementations of these facilities are expressed in terms of
the <code class="sourceCode default">scope_token</code> concept:</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">template</span> <span class="op">&lt;</span><span class="kw">class</span> Token<span class="op">&gt;</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="kw">concept</span> scope_token <span class="op">=</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>    copyable<span class="op">&lt;</span>Token<span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a>    <span class="kw">requires</span><span class="op">(</span><span class="kw">const</span> Token token<span class="op">)</span> <span class="op">{</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>        <span class="op">{</span> token<span class="op">.</span>try_associate<span class="op">()</span> <span class="op">}</span> <span class="op">-&gt;</span> same_as<span class="op">&lt;</span><span class="dt">bool</span><span class="op">&gt;</span>;</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>        <span class="op">{</span> token<span class="op">.</span>disassociate<span class="op">()</span> <span class="op">}</span> <span class="kw">noexcept</span> <span class="op">-&gt;</span> same_as<span class="op">&lt;</span><span class="dt">void</span><span class="op">&gt;</span>;</span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>        <span class="op">{</span> token<span class="op">.</span>wrap<span class="op">(</span>declval<span class="op">&lt;</span>test<span class="op">-</span>sender<span class="op">&gt;())</span> <span class="op">}</span> <span class="op">-&gt;</span> sender_in<span class="op">&lt;</span>test<span class="op">-</span>env<span class="op">&gt;</span>;</span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span>;</span></code></pre></div>
<p>During the development of these sample implementations, it was
observed that reintroducing the
<code class="sourceCode default">scope_association</code> concept from
<span class="citation" data-cites="P3149R7">[<a href="#ref-P3149R7" role="doc-biblioref">P3149R7</a>]</span> would yield several
benefits:</p>
<ul>
<li>reduced binary size for both scopes and basis operations,</li>
<li>fewer move/copy operations,</li>
<li>and a simplified implementation model that in turn facilitates
easier customization.</li>
</ul>
<p>These improvements can be achieved without any impact on the
user-facing APIs proposed in R11.</p>
<p>Illustrated below are the R11 implementations of
<code class="sourceCode default">spawn</code> and
<code class="sourceCode default">associate</code> in contrast with the
<code class="sourceCode default">scope_association</code> concept
implementation.</p>
<h2 data-number="2.1" id="executionspawn"><span class="header-section-number">2.1</span> execution::spawn<a href="#executionspawn" class="self-link"></a></h2>
<table>
<thead>
<tr class="header">
<th><div style="text-align:center">
<strong>Before</strong>
</div></th>
<th><div style="text-align:center">
<strong>After</strong>
</div></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><div>

<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="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> Alloc, scope_token Token, sender Sender<span class="op">&gt;</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> <em>spawn-state</em> <span class="op">:</span> <em>spawn-state-base</em> <span class="op">{</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a>  <span class="kw">using</span> <em>op-t</em> <span class="op">=</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a>     connect_result_t<span class="op">&lt;</span>Sender, <em>spawn-receiver</em><span class="op">&gt;</span>;</span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a>  <em>spawn-state</em><span class="op">(</span>Alloc a, Sender<span class="op">&amp;&amp;</span> sndr, Token t<span class="op">)</span></span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a>      <span class="op">:</span> <em>alloc</em><span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>a<span class="op">))</span>,</span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a>        <em>op</em><span class="op">(</span><span class="fu">connect</span><span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>sndr<span class="op">)</span>,</span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a>        <em>spawn-receiver</em><span class="op">{</span><span class="kw">this</span><span class="op">}))</span>,</span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a>        <em>token</em><span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>t<span class="op">))</span> <span class="op">{}</span></span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> run<span class="op">()</span> <span class="kw">noexcept</span> <span class="op">{</span></span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><em>token</em><span class="op">.</span>try_associate<span class="op">())</span></span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a>      <em>op</em><span class="op">.</span>start<span class="op">()</span>;</span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a>    <span class="cf">else</span></span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a>      destroy<span class="op">()</span>;</span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> complete<span class="op">()</span> <span class="kw">noexcept</span> <span class="kw">override</span> <span class="op">{</span></span>
<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a>    <span class="kw">auto</span> t <span class="op">=</span> std<span class="op">::</span>move<span class="op">(</span><em>token</em><span class="op">)</span>;</span>
<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a>    destroy<span class="op">()</span>;</span>
<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a>    t<span class="op">.</span>disassociate<span class="op">()</span>;</span>
<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span></code></pre></div>

</div></td>
<td><div>

<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="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> Alloc, scope_token Token, sender Sender<span class="op">&gt;</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> <em>spawn-state</em> <span class="op">:</span> <em>spawn-state-base</em> <span class="op">{</span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>  <span class="kw">using</span> <em>op-t</em> <span class="op">=</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a>     connect_result_t<span class="op">&lt;</span>Sender, <em>spawn-receiver</em><span class="op">&gt;</span>;</span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a>  <span class="kw">using</span> <em>assoc-t</em> <span class="op">=</span> remove_cvref_t<span class="op">&lt;</span><span class="kw">decltype</span><span class="op">(</span></span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a>          declval<span class="op">&lt;</span>Token<span class="op">&amp;&gt;().</span>try_associate<span class="op">())&gt;</span>;</span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true" tabindex="-1"></a>  <em>spawn-state</em><span class="op">(</span>Alloc a, Sender<span class="op">&amp;&amp;</span> sndr, Token t<span class="op">)</span></span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true" tabindex="-1"></a>    <span class="op">:</span> <em>alloc</em><span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>a<span class="op">))</span>,</span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true" tabindex="-1"></a>      <em>op</em><span class="op">(</span><span class="fu">connect</span><span class="op">(</span></span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true" tabindex="-1"></a>        std<span class="op">::</span>move<span class="op">(</span>sndr<span class="op">)</span>,</span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true" tabindex="-1"></a>        <em>spawn-receiver</em><span class="op">{</span><span class="kw">this</span><span class="op">}))</span> <span class="op">{</span></span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true" tabindex="-1"></a>    <em>assoc</em> <span class="op">=</span> t<span class="op">.</span>try_associate<span class="op">()</span>;</span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> run<span class="op">()</span> <span class="kw">noexcept</span> <span class="op">{</span></span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span>assoc<span class="op">)</span></span>
<span id="cb3-18"><a href="#cb3-18" aria-hidden="true" tabindex="-1"></a>      <em>op</em><span class="op">.</span>start<span class="op">()</span>;</span>
<span id="cb3-19"><a href="#cb3-19" aria-hidden="true" tabindex="-1"></a>    <span class="cf">else</span></span>
<span id="cb3-20"><a href="#cb3-20" aria-hidden="true" tabindex="-1"></a>      destroy<span class="op">()</span>;</span>
<span id="cb3-21"><a href="#cb3-21" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb3-22"><a href="#cb3-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-23"><a href="#cb3-23" aria-hidden="true" tabindex="-1"></a>  <span class="dt">void</span> complete<span class="op">()</span> <span class="kw">noexcept</span> <span class="kw">override</span> <span class="op">{</span></span>
<span id="cb3-24"><a href="#cb3-24" aria-hidden="true" tabindex="-1"></a>    <span class="kw">auto</span> a <span class="op">=</span> std<span class="op">::</span>move<span class="op">(</span>assoc<span class="op">)</span>;</span>
<span id="cb3-25"><a href="#cb3-25" aria-hidden="true" tabindex="-1"></a>    destroy<span class="op">()</span>;</span>
<span id="cb3-26"><a href="#cb3-26" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb3-27"><a href="#cb3-27" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span></code></pre></div>

</div></td>
</tr>
</tbody>
</table>
<h2 data-number="2.2" id="executionassociate"><span class="header-section-number">2.2</span> execution::associate<a href="#executionassociate" class="self-link"></a></h2>
<table>
<thead>
<tr class="header">
<th><div style="text-align:center">
<strong>Before</strong>
</div></th>
<th><div style="text-align:center">
<strong>After</strong>
</div></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><div>

<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>scope_token Token, sender Sender<span class="op">&gt;</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> <em>associate-data</em> <span class="op">{</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a>  <span class="kw">explicit</span> <em>associate-data</em><span class="op">(</span>Token t, Sender<span class="op">&amp;&amp;</span> s<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a>      <span class="kw">noexcept</span><span class="op">(</span>t<span class="op">.</span>wrap<span class="op">(</span>std<span class="op">::</span>forward<span class="op">&lt;</span>Sender<span class="op">&gt;(</span>s<span class="op">)))</span> <span class="op">&amp;&amp;</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a>      <span class="kw">noexcept</span><span class="op">(</span>t<span class="op">.</span>try_associate<span class="op">()))</span></span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a>      <span class="op">:</span> <em>token</em><span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>t<span class="op">))</span>,</span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a>        <em>sndr</em><span class="op">(</span>token<span class="op">.</span>wrap<span class="op">(</span>std<span class="op">::</span>forward<span class="op">&lt;</span>Sender<span class="op">&gt;(</span>s<span class="op">)))</span> <span class="op">{</span></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(!</span><em>token</em><span class="op">.</span>try_associate<span class="op">())</span> <span class="op">{</span></span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a>      <em>sndr</em><span class="op">.</span>reset<span class="op">()</span>;</span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true" tabindex="-1"></a>  <em>associate-data</em><span class="op">(</span><span class="kw">const</span> <em>associate-data</em><span class="op">&amp;</span> other<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span></span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true" tabindex="-1"></a>      is_nothrow_copy_constructible_v<span class="op">&lt;</span><em>wrap-sender</em><span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true" tabindex="-1"></a>      <span class="kw">noexcept</span><span class="op">(</span>other<span class="op">.</span><em>token</em><span class="op">.</span>try_associate<span class="op">()))</span></span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true" tabindex="-1"></a>      <span class="kw">requires</span> copy_constructible<span class="op">&lt;</span><em>wrap-sender</em><span class="op">&gt;</span></span>
<span id="cb4-17"><a href="#cb4-17" aria-hidden="true" tabindex="-1"></a>      <span class="op">:</span> token<span class="op">(</span>other<span class="op">.</span>token<span class="op">)</span> <span class="op">{</span></span>
<span id="cb4-18"><a href="#cb4-18" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span>other<span class="op">.</span>sndr<span class="op">.</span>has_value<span class="op">()</span> <span class="op">&amp;&amp;</span> token<span class="op">.</span>try_associate<span class="op">())</span> <span class="op">{</span></span>
<span id="cb4-19"><a href="#cb4-19" aria-hidden="true" tabindex="-1"></a>      <span class="cf">try</span> <span class="op">{</span></span>
<span id="cb4-20"><a href="#cb4-20" aria-hidden="true" tabindex="-1"></a>        sndr<span class="op">.</span>emplace<span class="op">(*</span>other<span class="op">.</span>sndr<span class="op">)</span>;</span>
<span id="cb4-21"><a href="#cb4-21" aria-hidden="true" tabindex="-1"></a>      <span class="op">}</span> <span class="cf">catch</span> <span class="op">(...)</span> <span class="op">{</span></span>
<span id="cb4-22"><a href="#cb4-22" aria-hidden="true" tabindex="-1"></a>        token<span class="op">.</span>disassociate<span class="op">()</span>;</span>
<span id="cb4-23"><a href="#cb4-23" aria-hidden="true" tabindex="-1"></a>        <span class="cf">throw</span>;</span>
<span id="cb4-24"><a href="#cb4-24" aria-hidden="true" tabindex="-1"></a>      <span class="op">}</span></span>
<span id="cb4-25"><a href="#cb4-25" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
<span id="cb4-26"><a href="#cb4-26" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb4-27"><a href="#cb4-27" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-28"><a href="#cb4-28" aria-hidden="true" tabindex="-1"></a>  <em>associate-data</em><span class="op">(</span><em>associate-data</em><span class="op">&amp;&amp;</span> other<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span></span>
<span id="cb4-29"><a href="#cb4-29" aria-hidden="true" tabindex="-1"></a>      is_nothrow_move_constructible_v<span class="op">&lt;</span><em>wrap-sender</em><span class="op">&gt;)</span></span>
<span id="cb4-30"><a href="#cb4-30" aria-hidden="true" tabindex="-1"></a>      <span class="op">:</span> <em>sndr</em><span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>other<span class="op">).</span><em>sndr</em><span class="op">)</span>,</span>
<span id="cb4-31"><a href="#cb4-31" aria-hidden="true" tabindex="-1"></a>        <em>token</em><span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>other<span class="op">).</span><em>token</em><span class="op">)</span> <span class="op">{</span></span>
<span id="cb4-32"><a href="#cb4-32" aria-hidden="true" tabindex="-1"></a>    other<span class="op">.</span><em>sndr</em><span class="op">.</span>reset<span class="op">()</span>;</span>
<span id="cb4-33"><a href="#cb4-33" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb4-34"><a href="#cb4-34" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-35"><a href="#cb4-35" aria-hidden="true" tabindex="-1"></a>  <span class="op">~</span><em>associate-data</em><span class="op">()</span> <span class="op">{</span></span>
<span id="cb4-36"><a href="#cb4-36" aria-hidden="true" tabindex="-1"></a>    <em>sndr</em><span class="op">.</span>reset<span class="op">()</span>;</span>
<span id="cb4-37"><a href="#cb4-37" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb4-38"><a href="#cb4-38" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-39"><a href="#cb4-39" aria-hidden="true" tabindex="-1"></a>  optional<span class="op">&lt;</span>pair<span class="op">&lt;</span>Token, wrap_sender<span class="op">&gt;&gt;</span> release<span class="op">()</span> <span class="op">&amp;&amp;</span> <span class="kw">noexcept</span><span class="op">(</span></span>
<span id="cb4-40"><a href="#cb4-40" aria-hidden="true" tabindex="-1"></a>      is_nothrow_move_constructible_v<span class="op">&lt;</span><em>wrap-sender</em><span class="op">&gt;)</span> <span class="op">{</span></span>
<span id="cb4-41"><a href="#cb4-41" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><em>sndr</em><span class="op">)</span> <span class="op">{</span></span>
<span id="cb4-42"><a href="#cb4-42" aria-hidden="true" tabindex="-1"></a>      <span class="cf">return</span> optional<span class="op">{</span></span>
<span id="cb4-43"><a href="#cb4-43" aria-hidden="true" tabindex="-1"></a>          pair<span class="op">{</span>std<span class="op">::</span>move<span class="op">(</span><em>token</em><span class="op">)</span>, std<span class="op">::</span>move<span class="op">(*</span><em>sndr</em><span class="op">)}}</span>;</span>
<span id="cb4-44"><a href="#cb4-44" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span> <span class="cf">else</span> <span class="op">{</span></span>
<span id="cb4-45"><a href="#cb4-45" aria-hidden="true" tabindex="-1"></a>      <span class="cf">return</span> nullopt;</span>
<span id="cb4-46"><a href="#cb4-46" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
<span id="cb4-47"><a href="#cb4-47" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb4-48"><a href="#cb4-48" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-49"><a href="#cb4-49" aria-hidden="true" tabindex="-1"></a><span class="kw">private</span><span class="op">:</span></span>
<span id="cb4-50"><a href="#cb4-50" aria-hidden="true" tabindex="-1"></a>  optional<span class="op">&lt;</span><em>wrap-sender</em><span class="op">&gt;</span> <em>sndr</em>;</span>
<span id="cb4-51"><a href="#cb4-51" aria-hidden="true" tabindex="-1"></a>  Token <em>token</em>;</span>
<span id="cb4-52"><a href="#cb4-52" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span></code></pre></div>

</div></td>
<td><div>

<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>scope_token Token, sender Sender<span class="op">&gt;</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="kw">struct</span> <em>associate-data</em> <span class="op">{</span></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a>  <span class="kw">explicit</span> <em>associate-data</em><span class="op">(</span>Token t, Sender<span class="op">&amp;&amp;</span> s<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a>      <span class="kw">noexcept</span><span class="op">(</span>t<span class="op">.</span>wrap<span class="op">(</span>std<span class="op">::</span>forward<span class="op">&lt;</span>Sender<span class="op">&gt;(</span>s<span class="op">)))</span> <span class="op">&amp;&amp;</span></span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true" tabindex="-1"></a>      <span class="kw">noexcept</span><span class="op">(</span>t<span class="op">.</span>try_associate<span class="op">()))</span></span>
<span id="cb5-6"><a href="#cb5-6" aria-hidden="true" tabindex="-1"></a>      <span class="op">:</span> <em>sndr</em><span class="op">(</span>t<span class="op">.</span>wrap<span class="op">(</span>std<span class="op">::</span>forward<span class="op">&lt;</span>Sender<span class="op">&gt;(</span>s<span class="op">)))</span> <span class="op">{</span></span>
<span id="cb5-7"><a href="#cb5-7" aria-hidden="true" tabindex="-1"></a>    sender_ref guard<span class="op">{</span>addressof<span class="op">(</span>sndr<span class="op">)}</span>;</span>
<span id="cb5-8"><a href="#cb5-8" aria-hidden="true" tabindex="-1"></a>    <em>assoc</em> <span class="op">=</span> t<span class="op">.</span>try_associate<span class="op">()</span>;</span>
<span id="cb5-9"><a href="#cb5-9" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><em>assoc</em><span class="op">)</span> <span class="op">{</span></span>
<span id="cb5-10"><a href="#cb5-10" aria-hidden="true" tabindex="-1"></a>      <span class="op">(</span><span class="dt">void</span><span class="op">)</span>guard<span class="op">.</span>release<span class="op">()</span>;</span>
<span id="cb5-11"><a href="#cb5-11" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
<span id="cb5-12"><a href="#cb5-12" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb5-13"><a href="#cb5-13" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-14"><a href="#cb5-14" aria-hidden="true" tabindex="-1"></a>  <em>associate-data</em><span class="op">(</span><span class="kw">const</span> <em>associate-data</em><span class="op">&amp;</span> other<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span></span>
<span id="cb5-15"><a href="#cb5-15" aria-hidden="true" tabindex="-1"></a>      is_nothrow_copy_constructible_v<span class="op">&lt;</span><em>wrap-sender</em><span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb5-16"><a href="#cb5-16" aria-hidden="true" tabindex="-1"></a>      is_nothrow_copy_constructible_v<span class="op">&lt;</span>assoc_t<span class="op">&gt;)</span></span>
<span id="cb5-17"><a href="#cb5-17" aria-hidden="true" tabindex="-1"></a>      <span class="kw">requires</span> copy_constructible<span class="op">&lt;</span><em>wrap-sender</em><span class="op">&gt;</span></span>
<span id="cb5-18"><a href="#cb5-18" aria-hidden="true" tabindex="-1"></a>      <span class="op">:</span> <em>assoc</em><span class="op">(</span>other<span class="op">.</span><em>assoc</em><span class="op">)</span> <span class="op">{</span></span>
<span id="cb5-19"><a href="#cb5-19" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><em>assoc</em><span class="op">)</span> <span class="op">{</span></span>
<span id="cb5-20"><a href="#cb5-20" aria-hidden="true" tabindex="-1"></a>      construct_at<span class="op">(</span>addressof<span class="op">(</span><em>sndr</em><span class="op">)</span>, other<span class="op">.</span><em>sndr</em><span class="op">)</span>;</span>
<span id="cb5-21"><a href="#cb5-21" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
<span id="cb5-22"><a href="#cb5-22" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb5-23"><a href="#cb5-23" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-24"><a href="#cb5-24" aria-hidden="true" tabindex="-1"></a>  <em>associate-data</em><span class="op">(</span><em>associate-data</em><span class="op">&amp;&amp;</span> other<span class="op">)</span> <span class="kw">noexcept</span><span class="op">(</span></span>
<span id="cb5-25"><a href="#cb5-25" aria-hidden="true" tabindex="-1"></a>      is_nothrow_move_constructible_v<span class="op">&lt;</span><em>wrap-sender</em><span class="op">&gt;)</span></span>
<span id="cb5-26"><a href="#cb5-26" aria-hidden="true" tabindex="-1"></a>      <span class="op">:</span> <em>associate-data</em><span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>other<span class="op">).</span>release<span class="op">())</span> <span class="op">{}</span></span>
<span id="cb5-27"><a href="#cb5-27" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-28"><a href="#cb5-28" aria-hidden="true" tabindex="-1"></a>  <span class="op">~</span><em>associate-data</em><span class="op">()</span> <span class="op">{</span></span>
<span id="cb5-29"><a href="#cb5-29" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><em>assoc</em><span class="op">)</span> <span class="op">{</span></span>
<span id="cb5-30"><a href="#cb5-30" aria-hidden="true" tabindex="-1"></a>      destroy_at<span class="op">(</span>addressof<span class="op">(</span><em>sndr</em><span class="op">))</span>;</span>
<span id="cb5-31"><a href="#cb5-31" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
<span id="cb5-32"><a href="#cb5-32" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb5-33"><a href="#cb5-33" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-34"><a href="#cb5-34" aria-hidden="true" tabindex="-1"></a>  pair<span class="op">&lt;</span>assoc_t, sender_ref<span class="op">&gt;</span> release<span class="op">()</span> <span class="op">&amp;&amp;</span> <span class="kw">noexcept</span> <span class="op">{</span></span>
<span id="cb5-35"><a href="#cb5-35" aria-hidden="true" tabindex="-1"></a>    <em>wrap-sender</em><span class="op">*</span> p <span class="op">=</span> <em>assoc</em> <span class="op">?</span> addressof<span class="op">(</span><em>sndr</em><span class="op">)</span> <span class="op">:</span> <span class="kw">nullptr</span>;</span>
<span id="cb5-36"><a href="#cb5-36" aria-hidden="true" tabindex="-1"></a>    <span class="cf">return</span> pair<span class="op">{</span>std<span class="op">::</span>move<span class="op">(</span><em>assoc</em><span class="op">)</span>, sender_ref<span class="op">{</span>p<span class="op">}}</span>;</span>
<span id="cb5-37"><a href="#cb5-37" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb5-38"><a href="#cb5-38" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-39"><a href="#cb5-39" aria-hidden="true" tabindex="-1"></a> <span class="kw">private</span><span class="op">:</span></span>
<span id="cb5-40"><a href="#cb5-40" aria-hidden="true" tabindex="-1"></a>  assoc_t <em>assoc</em>;</span>
<span id="cb5-41"><a href="#cb5-41" aria-hidden="true" tabindex="-1"></a>  <span class="kw">union</span> <span class="op">{</span></span>
<span id="cb5-42"><a href="#cb5-42" aria-hidden="true" tabindex="-1"></a>    <em>wrap-sender</em> <em>sndr</em>;</span>
<span id="cb5-43"><a href="#cb5-43" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span>;</span>
<span id="cb5-44"><a href="#cb5-44" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-45"><a href="#cb5-45" aria-hidden="true" tabindex="-1"></a>  <em>associate-data</em><span class="op">(</span>pair<span class="op">&lt;</span>assoc_t, sender_ref<span class="op">&gt;</span> parts<span class="op">)</span></span>
<span id="cb5-46"><a href="#cb5-46" aria-hidden="true" tabindex="-1"></a>      <span class="op">:</span> <em>assoc</em><span class="op">(</span>std<span class="op">::</span>move<span class="op">(</span>parts<span class="op">.</span>first<span class="op">))</span> <span class="op">{</span></span>
<span id="cb5-47"><a href="#cb5-47" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> <span class="op">(</span><em>assoc</em><span class="op">)</span> <span class="op">{</span></span>
<span id="cb5-48"><a href="#cb5-48" aria-hidden="true" tabindex="-1"></a>      construct_at<span class="op">(</span>addressof<span class="op">(</span><em>sndr</em><span class="op">)</span>, std<span class="op">::</span>move<span class="op">(</span>parts<span class="op">.</span>second<span class="op">))</span>;</span>
<span id="cb5-49"><a href="#cb5-49" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span></span>
<span id="cb5-50"><a href="#cb5-50" aria-hidden="true" tabindex="-1"></a>  <span class="op">}</span></span>
<span id="cb5-51"><a href="#cb5-51" aria-hidden="true" tabindex="-1"></a><span class="op">}</span>;</span></code></pre></div>

</div></td>
</tr>
</tbody>
</table>
<h1 data-number="3" id="proposal"><span class="header-section-number">3</span> Proposal<a href="#proposal" class="self-link"></a></h1>
<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="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> Assoc<span class="op">&gt;</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">concept</span> scope_association <span class="op">=</span></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a>    movable<span class="op">&lt;</span>Assoc<span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a>    default_initializable<span class="op">&lt;</span>Assoc<span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a>    <span class="kw">requires</span><span class="op">(</span>Assoc assoc<span class="op">)</span> <span class="op">{</span></span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a>      <span class="op">{</span> <span class="kw">static_cast</span><span class="op">&lt;</span><span class="dt">bool</span><span class="op">&gt;(</span>assoc<span class="op">)</span> <span class="op">}</span> <span class="kw">noexcept</span>;</span>
<span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a>      <span class="op">{</span> assoc<span class="op">.</span>try_associate<span class="op">()</span> <span class="op">}</span> <span class="op">-&gt;</span> same_as<span class="op">&lt;</span>Assoc<span class="op">&gt;</span>;</span>
<span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span>;</span></code></pre></div>
<p>A type that models
<code class="sourceCode default">scope_association</code> is an RAII
handle that represents a possible association between a sender and an
async scope. If the scope association contextually converts to true then
the object is “engaged” and represents an association; otherwise, the
object is “disengaged” and represents the lack of an association. Scope
associations are movable and not copyable, and expose a
<code class="sourceCode default">try_associate</code> member function
with semantics identical to the
<code class="sourceCode default">try_associate</code> member function on
a type that models
<code class="sourceCode default">scope_token</code>.</p>
<p>The following are the proposed changes to
<code class="sourceCode default">scope_token</code>,
<code class="sourceCode default">associate</code>,
<code class="sourceCode default">spawn</code>,
<code class="sourceCode default">spawn_future</code>,
<code class="sourceCode default">simple_counting_scope</code>, and
<code class="sourceCode default">counting_scope</code> with the adoption
of <code class="sourceCode default">scope_association</code>.</p>
<h2 data-number="3.1" id="executionscope_token"><span class="header-section-number">3.1</span>
<code class="sourceCode default">execution::scope_token</code><a href="#executionscope_token" class="self-link"></a></h2>
<p>The primary change to
<code class="sourceCode default">scope_token</code> is to
<code class="sourceCode default">try_associate</code>, which will return
a <code class="sourceCode default">scope_association</code> rather than
a <code class="sourceCode default">bool</code>.</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="kw">template</span> <span class="op">&lt;</span><span class="kw">class</span> Token<span class="op">&gt;</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>  <span class="kw">concept</span> scope_token <span class="op">=</span></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>    copyable<span class="op">&lt;</span>Token<span class="op">&gt;</span> <span class="op">&amp;&amp;</span></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a>    <span class="kw">requires</span><span class="op">(</span>Token token<span class="op">)</span> <span class="op">{</span></span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a>      <span class="op">{</span> token<span class="op">.</span>try_associate<span class="op">()</span> <span class="op">}</span> <span class="op">-&gt;</span> scope_association;</span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a>      <span class="op">{</span> token<span class="op">.</span>wrap<span class="op">(</span>declval<span class="op">&lt;</span><em>test-sender</em><span class="op">&gt;())</span> <span class="op">}</span> <span class="op">-&gt;</span> sender_in<span class="op">&lt;</span><em>test-env</em><span class="op">&gt;</span>;</span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a>    <span class="op">}</span>;</span></code></pre></div>
<p>The <code class="sourceCode default">try_associate</code> member
function on a token attempts to create a new association with the scope;
<code class="sourceCode default">try_associate</code> returns an engaged
association when the association is successful, and it may either return
a disengaged association or throw an exception to indicate failure.</p>
<h2 data-number="3.2" id="executionassociate-1"><span class="header-section-number">3.2</span>
<code class="sourceCode default">execution::associate</code><a href="#executionassociate-1" class="self-link"></a></h2>
<p>With the application of the proposed changes, the copy behavior of
the associate-sender returned from
<code class="sourceCode default">associate</code> becomes the
following:</p>
<p>If the sender, <code class="sourceCode default">snd</code>, provided
to <code class="sourceCode default">associate()</code> is copyable then
the resulting associate-sender is also copyable, with the following
rules:</p>
<ul>
<li><p>copying an unassociated associate-sender invariably produces a
new unassociated associate-sender; and</p></li>
<li><p>copying an associated associate-sender requires copying the
<em><code class="sourceCode default">associate-data</code></em> it
contains and the
<em><code class="sourceCode default">associate-data</code></em>
copy-constructor proceeds as follows:</p>
<ul>
<li><p>The result of invoking the source’s
<code class="sourceCode default"><em>association</em>.try_associate()</code>
will be passed to the destination
<em><code class="sourceCode default">associate-data</code></em>.</p>
<ul>
<li>if the resulting association is engaged then copy the wrapped sender
from the source into the destination
<em><code class="sourceCode default">associate-data</code></em>; the
destination associate-sender is associated</li>
<li>otherwise, the destination associate-sender is unassociated</li>
</ul></li>
</ul></li>
</ul>
<p>Furthermore, the
<em><code class="sourceCode default">operation-state</code></em>’s
destructor becomes the following:</p>
<p>An <em><code class="sourceCode default">operation-state</code></em>
with its own association must invoke the association’s destructor as the
last step of the
<em><code class="sourceCode default">operation-state</code></em>’s
destructor.</p>
<h2 data-number="3.3" id="executionspawn-1"><span class="header-section-number">3.3</span>
<code class="sourceCode default">execution::spawn</code><a href="#executionspawn-1" class="self-link"></a></h2>
<p>The behavior of <code class="sourceCode default">spawn</code> remains
largely unchanged, with the primary difference being that
<em><code class="sourceCode default">op_t</code></em> now holds an
<em><code class="sourceCode default">association</code></em> rather than
a <em><code class="sourceCode default">token</code></em>. Upon
completion of the
<em><code class="sourceCode default">operation-state</code></em>, the
destructor of the
<em><code class="sourceCode default">association</code></em> is invoked,
replacing the previous mechanism of explicitly calling
<code class="sourceCode default"><em>token</em>.disassociate()</code> on
the local copy of the
<em><code class="sourceCode default">token</code></em>.</p>
<h2 data-number="3.4" id="executionspawn_future"><span class="header-section-number">3.4</span>
<code class="sourceCode default">execution::spawn_future</code><a href="#executionspawn_future" class="self-link"></a></h2>
<p>The changes to <code class="sourceCode default">spawn_future</code>
reflect the same changes proposed in
<code class="sourceCode default">spawn</code>.</p>
<h2 data-number="3.5" id="executionsimple_counting_scope"><span class="header-section-number">3.5</span>
<code class="sourceCode default">execution::simple_counting_scope</code><a href="#executionsimple_counting_scope" class="self-link"></a></h2>
<p>The behavior of
<code class="sourceCode default">simple_counting_scope</code> remains
largely unchanged, with the primary difference being that the
disassociation is handled by the destructor of the association returned
from <code class="sourceCode default">token.try_associate()</code>.</p>
<h2 data-number="3.6" id="executioncounting_scope"><span class="header-section-number">3.6</span>
<code class="sourceCode default">execution::counting_scope</code><a href="#executioncounting_scope" class="self-link"></a></h2>
<p>The changes to <code class="sourceCode default">counting_scope</code>
reflect the same changes proposed in
<code class="sourceCode default">simple_counting_scope</code>.</p>
<h1 data-number="4" id="wording"><span class="header-section-number">4</span> Wording<a href="#wording" class="self-link"></a></h1>
<h2 data-number="4.1" id="header-execution-synopsis-execution.syn"><span class="header-section-number">4.1</span> Header
<code class="sourceCode default">&lt;execution&gt;</code> synopsis
<span>33.4
<a href="https://wg21.link/execution.syn">[execution.syn]</a></span><a href="#header-execution-synopsis-execution.syn" class="self-link"></a></h2>
<p>To the <code class="sourceCode default">&lt;execution&gt;</code>
synopsis <span>33.4
<a href="https://wg21.link/execution.syn">[execution.syn]</a></span>,
make the following change:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a>  // [exec.scope]</span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a>  // [exec.scope.concepts], scope concepts</span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>template &lt;class Token&gt;</ins></span></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>concept scope_association = <em>see below</em>;</ins></span></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a>  template &lt;class Token&gt;</span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true" tabindex="-1"></a>    concept scope_token = <em>see below</em>;</span></code></pre></div>
<h2 data-number="4.2" id="executionassociate-2"><span class="header-section-number">4.2</span>
<code class="sourceCode default">execution::associate</code><a href="#executionassociate-2" class="self-link"></a></h2>
<p>To the subsection <span>33.9.12.16
<a href="https://wg21.link/exec.associate">[exec.associate]</a></span>,
make the following changes:</p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
Let <em><code class="sourceCode default">associate-data</code></em> be
the following exposition-only class template:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a>namespace std::execution {</span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a>template &lt;scope_token Token, sender Sender&gt;</span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true" tabindex="-1"></a>struct <em>associate-data</em> {                                       // <em>exposition only</em></span>
<span id="cb9-5"><a href="#cb9-5" aria-hidden="true" tabindex="-1"></a>  using <em>wrap-sender</em> =                                         // <em>exposition only</em></span>
<span id="cb9-6"><a href="#cb9-6" aria-hidden="true" tabindex="-1"></a>    remove_cvref_t&lt;decltype(declval&lt;Token&amp;&gt;().wrap(declval&lt;Sender&gt;()))&gt;;</span>
<span id="cb9-7"><a href="#cb9-7" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>using <em>assoc-t</em> =</ins></span>                                             <span class="add" style="color: #006e28"><ins>// <em>exposition only</em></ins></span></span>
<span id="cb9-8"><a href="#cb9-8" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>decltype(declval&lt;Token&amp;&gt;().try_associate());</ins></span></span>
<span id="cb9-9"><a href="#cb9-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-10"><a href="#cb9-10" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>using <em>sender-ref</em> =</ins></span>                                          <span class="add" style="color: #006e28"><ins>// <em>exposition only</em></ins></span></span>
<span id="cb9-11"><a href="#cb9-11" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>unique_ptr&lt;<em>wrap-sender</em>, decltype([](auto* p) noexcept { destroy_at(p); })&gt;;</ins></span></span>
<span id="cb9-12"><a href="#cb9-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-13"><a href="#cb9-13" aria-hidden="true" tabindex="-1"></a>  explicit <em>associate-data</em>(Token t, Sender&amp;&amp; s)</span>
<span id="cb9-14"><a href="#cb9-14" aria-hidden="true" tabindex="-1"></a>    : <em>sndr</em>(t.wrap(std::forward&lt;Sender&gt;(s)))<span class="rm" style="color: #bf0303"><del>,</del></span><span class="add" style="color: #006e28"><ins> {</ins></span></span>
<span id="cb9-15"><a href="#cb9-15" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del><em>token</em>(t) {</del></span></span>
<span id="cb9-16"><a href="#cb9-16" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins><em>sender-ref</em> guard{addressof(<em>sndr</em>)};</ins></span></span>
<span id="cb9-17"><a href="#cb9-17" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-18"><a href="#cb9-18" aria-hidden="true" tabindex="-1"></a>    if (<span class="rm" style="color: #bf0303"><del>!<em>token</em></del></span><span class="add" style="color: #006e28"><ins><em>assoc</em> = t</ins></span>.try_associate())</span>
<span id="cb9-19"><a href="#cb9-19" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del><em>sndr</em>.reset()</del></span><span class="add" style="color: #006e28"><ins>(void)guard.release()</ins></span>;</span>
<span id="cb9-20"><a href="#cb9-20" aria-hidden="true" tabindex="-1"></a>  }</span>
<span id="cb9-21"><a href="#cb9-21" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-22"><a href="#cb9-22" aria-hidden="true" tabindex="-1"></a>  <em>associate-data</em>(const <em>associate-data</em>&amp; other)</span>
<span id="cb9-23"><a href="#cb9-23" aria-hidden="true" tabindex="-1"></a>    noexcept(is_nothrow_copy_constructible_v&lt;<em>wrap-sender</em>&gt; &amp;&amp;</span>
<span id="cb9-24"><a href="#cb9-24" aria-hidden="true" tabindex="-1"></a>             noexcept(other.<span class="rm" style="color: #bf0303"><del><em>token</em></del></span><span class="add" style="color: #006e28"><ins><em>assoc</em></ins></span>.try_associate()));</span>
<span id="cb9-25"><a href="#cb9-25" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-26"><a href="#cb9-26" aria-hidden="true" tabindex="-1"></a>  <em>associate-data</em>(<em>associate-data</em>&amp;&amp; other)</span>
<span id="cb9-27"><a href="#cb9-27" aria-hidden="true" tabindex="-1"></a>    noexcept(is_nothrow_move_constructible_v&lt;<em>wrap-sender</em>&gt;);</span>
<span id="cb9-28"><a href="#cb9-28" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-29"><a href="#cb9-29" aria-hidden="true" tabindex="-1"></a>  ~<em>associate-data</em>();</span>
<span id="cb9-30"><a href="#cb9-30" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-31"><a href="#cb9-31" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>optional&lt;pair&lt;Token, <em>wrap-sender</em>&gt;&gt;</del></span></span>
<span id="cb9-32"><a href="#cb9-32" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>pair&lt;<em>assoc-t</em>, <em>sender-ref</em>&gt;</ins></span></span>
<span id="cb9-33"><a href="#cb9-33" aria-hidden="true" tabindex="-1"></a>    release() &amp;&amp; noexcept<span class="rm" style="color: #bf0303"><del>(is_nothrow_move_constructible_v&lt;<em>wrap-sender</em>&gt;)</del></span>;</span>
<span id="cb9-34"><a href="#cb9-34" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-35"><a href="#cb9-35" aria-hidden="true" tabindex="-1"></a>private:</span>
<span id="cb9-36"><a href="#cb9-36" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>optional&lt;<em>wrap-sender</em>&gt; <em>sndr</em>;</del></span>  <span class="rm" style="color: #bf0303"><del>// <em>exposition only</em></del></span></span>
<span id="cb9-37"><a href="#cb9-37" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>Token <em>token</em>;</del></span>                 <span class="rm" style="color: #bf0303"><del>// <em>exposition only</em></del></span></span>
<span id="cb9-38"><a href="#cb9-38" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-39"><a href="#cb9-39" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><em>associate-data</em>(pair&lt;<em>assoc-t</em>, <em>scope-ref</em>&gt; parts);</ins></span>             <span class="add" style="color: #006e28"><ins>// <em>exposition only</em></ins></span></span>
<span id="cb9-40"><a href="#cb9-40" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-41"><a href="#cb9-41" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins><em>assoc-t</em> <em>assoc</em>;</ins></span>                                              <span class="add" style="color: #006e28"><ins>// <em>exposition only</em></ins></span></span>
<span id="cb9-42"><a href="#cb9-42" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>union {</ins></span></span>
<span id="cb9-43"><a href="#cb9-43" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins><em>wrap-sender</em> <em>sndr</em>;</ins></span>                                         <span class="add" style="color: #006e28"><ins>// <em>exposition only</em></ins></span></span>
<span id="cb9-44"><a href="#cb9-44" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>};</ins></span></span>
<span id="cb9-45"><a href="#cb9-45" aria-hidden="true" tabindex="-1"></a>};</span>
<span id="cb9-46"><a href="#cb9-46" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-47"><a href="#cb9-47" aria-hidden="true" tabindex="-1"></a>template &lt;scope_token Token, sender Sender&gt;</span>
<span id="cb9-48"><a href="#cb9-48" aria-hidden="true" tabindex="-1"></a>  <em>associate-data</em>(Token, Sender&amp;&amp;) -&gt; <em>associate-data</em>&lt;Token, Sender&gt;;</span>
<span id="cb9-49"><a href="#cb9-49" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-50"><a href="#cb9-50" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
For an <em><code class="sourceCode default">associate-data</code></em>
object <code class="sourceCode default">a</code>, <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">a.<em>sndr</em>.has_value()</code></span>
is</del></span> <span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">a.<em>assoc</em></code></span>
contextually converts to</ins></span>
<code class="sourceCode default">true</code> if and only if an
association was successfully made and is owned by
<code class="sourceCode default">a</code>.</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><em>associate-data</em>(const <em>associate-data</em>&amp; other)</span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a>  noexcept(is_nothrow_copy_constructible_v&lt;<em>wrap-sender</em>&gt; &amp;&amp;</span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true" tabindex="-1"></a>           noexcept(other.<span class="rm" style="color: #bf0303"><del><em>token</em></del></span><span class="add" style="color: #006e28"><ins><em>assoc</em></ins></span>.try_associate()));</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">4</a></span>
<em>Constraints:</em> <code class="sourceCode default">copy_constructible&lt;<em>wrap-sender</em>&gt;</code>
is <code class="sourceCode default">true</code>.</p>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
<em>Effects:</em> <span class="rm" style="color: #bf0303"><del>Value-initializes
<em><span><code class="sourceCode default">sndr</code></span></em> and
initializes
<em><span><code class="sourceCode default">token</code></span></em> with
<span><code class="sourceCode default">other.<em>token</em></code></span>.
If
<span><code class="sourceCode default">other.<em>sndr</em>.has_value()</code></span>
is <span><code class="sourceCode default">false</code></span>, no
further effects; otherwise, calls
<span><code class="sourceCode default"><em>token</em>.try_associate()</code></span>
and, if that returns
<span><code class="sourceCode default">true</code></span>, calls
<span><code class="sourceCode default"><em>sndr</em>.emplace(*other.<em>sndr</em>)</code></span>
and, if that exits with an exception, calls
<span><code class="sourceCode default"><em>token</em>.disassociate()</code></span>
before propagating the exception.</del></span> <span class="add" style="color: #006e28"><ins>Initializes
<em><span><code class="sourceCode default">assoc</code></span></em> with
<span><code class="sourceCode default">other.<em>assoc</em>.try_associate()</code></span>.
If <em><span><code class="sourceCode default">assoc</code></span></em>
contextually converts to
<span><code class="sourceCode default">false</code></span>, no further
effects; otherwise, initializes
<em><span><code class="sourceCode default">sndr</code></span></em> with
<span><code class="sourceCode default">other.<em>sndr</em></code></span>.</ins></span></p>
<div class="sourceCode" id="cb11"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><em>associate-data</em>(<em>associate-data</em>&amp;&amp; other)</span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a>  noexcept(is_nothrow_move_constructible_v&lt;<em>wrap-sender</em>&gt;);</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">6</a></span>
<em>Effects:</em> <span class="rm" style="color: #bf0303"><del>Initializes
<em><span><code class="sourceCode default">sndr</code></span></em> with
<span><code class="sourceCode default">std::move(other.<em>sndr</em>)</code></span>
and initializes
<em><span><code class="sourceCode default">token</code></span></em> with
<span><code class="sourceCode default">std::move(other.<em>token</em>)</code></span>
and then calls
<span><code class="sourceCode default">other.<em>sndr</em>.reset()</code></span>.</del></span>
<span class="add" style="color: #006e28"><ins>Equivalent to <span><code class="sourceCode default"><em>associate-data</em>(std::move(other).release())</code></span>.</ins></span></p>
<p><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default"><em>associate-data</em>(pair&lt;<em>assoc-t</em>, <em>sender-ref</em>&gt; parts);</code></span></ins></span></p>
<p><span class="add" style="color: #006e28"><ins><span class="marginalizedparent"><a class="marginalized">7</a></span>
<em>Effects:</em> Initializes
<em><span><code class="sourceCode default">assoc</code></span></em> with
<span><code class="sourceCode default">std::move(parts.first)</code></span>.
If <em><span><code class="sourceCode default">assoc</code></span></em>
contextually converts to
<span><code class="sourceCode default">false</code></span>, no further
effects; otherwise, initializes
<em><span><code class="sourceCode default">sndr</code></span></em> with
<span><code class="sourceCode default">std::move(*parts.second)</code></span>.</ins></span></p>
<p><code class="sourceCode default">~<em>associate-data</em>();</code></p>
<p><span class="marginalizedparent"><a class="marginalized">8</a></span>
<em>Effects:</em> <span class="rm" style="color: #bf0303"><del>If
<span><code class="sourceCode default"><em>sndr</em>.has_value()</code></span>
returns <span><code class="sourceCode default">false</code></span> then
no effect; otherwise, invokes
<span><code class="sourceCode default"><em>sndr</em>.reset()</code></span>
before invoking
<span><code class="sourceCode default"><em>token</em>.disassociate()</code></span>.</del></span>
<span class="add" style="color: #006e28"><ins>If
<em><span><code class="sourceCode default">assoc</code></span></em>
contextually converts to
<span><code class="sourceCode default">false</code></span> then no
effect; otherwise, destroys
<em><span><code class="sourceCode default">sndr</code></span></em>.</ins></span></p>
<p><span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">optional&lt;pair&lt;Token, <em>wrap-sender</em>&gt;&gt;</code></span></del></span><br />
<span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">pair&lt;<em>assoc-t</em>, <em>scope-ref</em>&gt;</code></span></ins></span><br />
<code class="sourceCode default">  release() &amp;&amp; noexcept<span class="rm" style="color: #bf0303"><del>(is_nothrow_move_constructible_v&lt;<em>wrap-sender</em>&gt;)</del></span>;</code></p>
<p><span class="marginalizedparent"><a class="marginalized">9</a></span>
<em>Effects:</em> <span class="rm" style="color: #bf0303"><del>If
<span><code class="sourceCode default"><em>sndr</em>.has_value()</code></span>
returns <span><code class="sourceCode default">false</code></span> then
returns an <span><code class="sourceCode default">optional</code></span>
that does not contain a value; otherwise returns an
<span><code class="sourceCode default">optional</code></span> containing
a value of type <span><code class="sourceCode default">pair&lt;Token, <em>wrap-sender</em>&gt;</code></span>
as if by:</del></span></p>
<p><span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">return optional(pair(<em>token</em>, std::move(*<em>sndr</em>)));</code></span></del></span></p>
<p><span class="add" style="color: #006e28"><ins>Constructs an object
<span><code class="sourceCode default">u</code></span> of type
<em><span><code class="sourceCode default">scope-ref</code></span></em>
that is initialized with
<span><code class="sourceCode default">nullptr</code></span> if
<em><span><code class="sourceCode default">assoc</code></span></em>
contextually converts to
<span><code class="sourceCode default">false</code></span> and with
<span><code class="sourceCode default">addressof(<em>sndr</em>)</code></span>
otherwise, then returns <span><code class="sourceCode default">pair{std::move(<em>assoc</em>), std::move(u)}</code></span>.</ins></span></p>
<p><span class="rm" style="color: #bf0303"><del><span class="marginalizedparent"><a class="marginalized">9</a></span>
<em>Postconditions:</em>
<em><span><code class="sourceCode default">sndr</code></span></em> does
not contain a value.</del></span></p>
<p><span class="marginalizedparent"><a class="marginalized">10</a></span> The
name <code class="sourceCode default">associate</code> denotes a
pipeable sender adaptor object. For subexpressions
<code class="sourceCode default">sndr</code> and
<code class="sourceCode default">token</code>, if
<code class="sourceCode default">decltype((sndr))</code> does not
satisfy <code class="sourceCode default">sender</code>, or <code class="sourceCode default">remove_cvref_t&lt;decltype((token))&gt;</code>
does not satisfy <code class="sourceCode default">scope_token</code>,
then <code class="sourceCode default">associate(sndr, token)</code> is
ill-formed.</p>
<p>…</p>
<p><span class="marginalizedparent"><a class="marginalized">13</a></span> The
member <code class="sourceCode default"><em>impls-for</em>&lt;associate_t&gt;::<em>get-state</em></code>
is initialized with a callable object equivalent to the following
lambda:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a>[]&lt;class Sndr, class Rcvr&gt;(Sndr&amp;&amp; sndr, Rcvr&amp; rcvr) noexcept(<em>see below</em>) {</span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a>  auto<span class="add" style="color: #006e28"><ins>&amp;&amp;</ins></span> [_, data] = std::forward&lt;Sndr&gt;(sndr);</span>
<span id="cb12-3"><a href="#cb12-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-4"><a href="#cb12-4" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>auto dataParts = std::move(data).release();</del></span></span>
<span id="cb12-5"><a href="#cb12-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-6"><a href="#cb12-6" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>using scope_token = decltype(dataParts-&gt;first);</del></span></span>
<span id="cb12-7"><a href="#cb12-7" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>using wrap_sender = decltype(dataParts-&gt;second);</del></span></span>
<span id="cb12-8"><a href="#cb12-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-9"><a href="#cb12-9" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>using associate_data_t = remove_cvref_t&lt;decltype(data)&gt;;</ins></span></span>
<span id="cb12-10"><a href="#cb12-10" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>using assoc_t = typename associate_data_t::<em>assoc-t</em>;</ins></span></span>
<span id="cb12-11"><a href="#cb12-11" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>using sender_ref_t = typename associate_data_t::<em>sender-ref</em>;</ins></span></span>
<span id="cb12-12"><a href="#cb12-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-13"><a href="#cb12-13" aria-hidden="true" tabindex="-1"></a>  using op_t = connect_result_t&lt;<span class="rm" style="color: #bf0303"><del>wrap_sender</del></span><span class="add" style="color: #006e28"><ins>typename sender_ref_t::element_type</ins></span>, Rcvr&gt;;</span>
<span id="cb12-14"><a href="#cb12-14" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-15"><a href="#cb12-15" aria-hidden="true" tabindex="-1"></a>  struct op_state {</span>
<span id="cb12-16"><a href="#cb12-16" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>bool</del></span><span class="add" style="color: #006e28"><ins>assoc_t</ins></span> <em>assoc</em><span class="rm" style="color: #bf0303"><del><em>iated</em> = false</del></span>;   // <em>exposition only</em></span>
<span id="cb12-17"><a href="#cb12-17" aria-hidden="true" tabindex="-1"></a>    union {</span>
<span id="cb12-18"><a href="#cb12-18" aria-hidden="true" tabindex="-1"></a>      Rcvr* <em>rcvr</em>;              // <em>exposition only</em></span>
<span id="cb12-19"><a href="#cb12-19" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>struct {</del></span></span>
<span id="cb12-20"><a href="#cb12-20" aria-hidden="true" tabindex="-1"></a>        <span class="rm" style="color: #bf0303"><del>scope_token <em>token</em>;</del></span>     <span class="rm" style="color: #bf0303"><del>// <em>exposition only</em></del></span></span>
<span id="cb12-21"><a href="#cb12-21" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>  </del></span>op_t <em>op</em>;               // <em>exposition only</em></span>
<span id="cb12-22"><a href="#cb12-22" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>} <em>assoc</em>;</del></span>                 <span class="rm" style="color: #bf0303"><del>// <em>exposition only</em></del></span></span>
<span id="cb12-23"><a href="#cb12-23" aria-hidden="true" tabindex="-1"></a>    };</span>
<span id="cb12-24"><a href="#cb12-24" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-25"><a href="#cb12-25" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>explicit op_state(Rcvr&amp; r) noexcept</del></span></span>
<span id="cb12-26"><a href="#cb12-26" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>: <em>rcvr</em>(addressof(r)) {}</del></span></span>
<span id="cb12-27"><a href="#cb12-27" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-28"><a href="#cb12-28" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>explicit op_state(scope_token tkn, wrap_sender&amp;&amp; sndr, Rcvr&amp; r) try</del></span></span>
<span id="cb12-29"><a href="#cb12-29" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>: <em>associated</em>(true),</del></span></span>
<span id="cb12-30"><a href="#cb12-30" aria-hidden="true" tabindex="-1"></a>        <span class="rm" style="color: #bf0303"><del><em>assoc</em>(tkn, connect(std::move(sndr), std::move(r))) {</del></span></span>
<span id="cb12-31"><a href="#cb12-31" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>}</del></span></span>
<span id="cb12-32"><a href="#cb12-32" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>catch (…) {</del></span></span>
<span id="cb12-33"><a href="#cb12-33" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>tkn.disassociate();</del></span></span>
<span id="cb12-34"><a href="#cb12-34" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>throw;</del></span></span>
<span id="cb12-35"><a href="#cb12-35" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>}</del></span></span>
<span id="cb12-36"><a href="#cb12-36" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-37"><a href="#cb12-37" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>explicit op_state(pair&lt;assoc_t, sender_ref_t&gt; parts, Rcvr&amp; r)</ins></span></span>
<span id="cb12-38"><a href="#cb12-38" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>: <em>assoc</em>(std::move(parts.first)) {</ins></span></span>
<span id="cb12-39"><a href="#cb12-39" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>if (<em>assoc</em>)</ins></span></span>
<span id="cb12-40"><a href="#cb12-40" aria-hidden="true" tabindex="-1"></a>        <span class="add" style="color: #006e28"><ins>::new (<em>voidify</em>(<em>op</em>)) op_t{</ins></span></span>
<span id="cb12-41"><a href="#cb12-41" aria-hidden="true" tabindex="-1"></a>          <span class="add" style="color: #006e28"><ins>connect(std::move(*parts.second), std::move(r))};</ins></span></span>
<span id="cb12-42"><a href="#cb12-42" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>else</ins></span></span>
<span id="cb12-43"><a href="#cb12-43" aria-hidden="true" tabindex="-1"></a>        <span class="add" style="color: #006e28"><ins>rcvr = addressof(r);</ins></span></span>
<span id="cb12-44"><a href="#cb12-44" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>}</ins></span></span>
<span id="cb12-45"><a href="#cb12-45" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-46"><a href="#cb12-46" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>explicit op_state(associate_data_t&amp;&amp; ad, Rcvr&amp; r)</ins></span></span>
<span id="cb12-47"><a href="#cb12-47" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>: op_state(std::move(ad).release(), r) {}</ins></span></span>
<span id="cb12-48"><a href="#cb12-48" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-49"><a href="#cb12-49" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>explicit op_state(const associate_data_t&amp; ad, Rcvr&amp; r)</ins></span></span>
<span id="cb12-50"><a href="#cb12-50" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>requires copy_constructible&lt;associate_data_t&gt;</ins></span></span>
<span id="cb12-51"><a href="#cb12-51" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>: op_state(associate_data_t(ad).release(), r) {}</ins></span></span>
<span id="cb12-52"><a href="#cb12-52" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-53"><a href="#cb12-53" aria-hidden="true" tabindex="-1"></a>    op_state(op_state&amp;&amp;) = delete;</span>
<span id="cb12-54"><a href="#cb12-54" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-55"><a href="#cb12-55" aria-hidden="true" tabindex="-1"></a>    ~op_state() {</span>
<span id="cb12-56"><a href="#cb12-56" aria-hidden="true" tabindex="-1"></a>      if (<em>assoc<span class="rm" style="color: #bf0303"><del>iated</del></span></em>)<span class="rm" style="color: #bf0303"><del> {</del></span></span>
<span id="cb12-57"><a href="#cb12-57" aria-hidden="true" tabindex="-1"></a>        <span class="rm" style="color: #bf0303"><del><em>assoc</em>.</del></span><em>op</em>.~op_t();</span>
<span id="cb12-58"><a href="#cb12-58" aria-hidden="true" tabindex="-1"></a>        <span class="rm" style="color: #bf0303"><del><em>assoc</em>._token_.disassociate();</del></span></span>
<span id="cb12-59"><a href="#cb12-59" aria-hidden="true" tabindex="-1"></a>        <span class="rm" style="color: #bf0303"><del><em>assoc</em>._token_.~scope_token();</del></span></span>
<span id="cb12-60"><a href="#cb12-60" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>}</del></span></span>
<span id="cb12-61"><a href="#cb12-61" aria-hidden="true" tabindex="-1"></a>    }</span>
<span id="cb12-62"><a href="#cb12-62" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-63"><a href="#cb12-63" aria-hidden="true" tabindex="-1"></a>    void <em>run</em>() noexcept {    // <em>exposition only</em></span>
<span id="cb12-64"><a href="#cb12-64" aria-hidden="true" tabindex="-1"></a>      if (<em>assoc<span class="rm" style="color: #bf0303"><del>iated</del></span></em>)</span>
<span id="cb12-65"><a href="#cb12-65" aria-hidden="true" tabindex="-1"></a>        start(<span class="rm" style="color: #bf0303"><del><em>assoc</em>.</del></span><em>op</em>);</span>
<span id="cb12-66"><a href="#cb12-66" aria-hidden="true" tabindex="-1"></a>      else</span>
<span id="cb12-67"><a href="#cb12-67" aria-hidden="true" tabindex="-1"></a>        set_stopped(std::move(*<em>rcvr</em>));</span>
<span id="cb12-68"><a href="#cb12-68" aria-hidden="true" tabindex="-1"></a>    }</span>
<span id="cb12-69"><a href="#cb12-69" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb12-70"><a href="#cb12-70" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb12-71"><a href="#cb12-71" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>if (dataParts)</del></span></span>
<span id="cb12-72"><a href="#cb12-72" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>return op_state{std::move(dataParts-&gt;first), std::move(dataParts-&gt;second), rcvr};</del></span></span>
<span id="cb12-73"><a href="#cb12-73" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>else</del></span></span>
<span id="cb12-74"><a href="#cb12-74" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>  </del></span>return op_state{<span class="add" style="color: #006e28"><ins>std::forward_like<Sndr>(data), </ins></span>rcvr};</span>
<span id="cb12-75"><a href="#cb12-75" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">14</a></span> The
expression in the <code class="sourceCode default">noexcept</code>
clause of <code class="sourceCode default"><em>impls-for</em>&lt;associate_t&gt;::<em>get-state</em></code>
is</p>
<p><code class="sourceCode default">  <span class="rm" style="color: #bf0303"><del>is_nothrow_constructible_v&lt;remove_cvref_t<Sndr>, Sndr&gt; &amp;&amp;</del></span></code><br />
<code class="sourceCode default">  <span class="rm" style="color: #bf0303"><del>is_nothrow_move_constructible_v&lt;<em>wrap-sender</em>&gt; &amp;&amp;</del></span></code><br />
<code class="sourceCode default">  <span class="add" style="color: #006e28"><ins>(is_rvalue_reference_v&lt;Sndr&amp;&amp;&gt; || is_nothrow_constructible_v&lt;remove_cvref_t<Sndr>, Sndr&gt;) &amp;&amp;</ins></span></code><br />
<code class="sourceCode default">  <em>nothrow-callable</em>&lt;connect_t, <em>wrap-sender</em>, Rcvr&gt;</code></p>
<p>where <em><code class="sourceCode default">wrap-sender</code></em> is
the type <code class="sourceCode default">remove_cvref_t&lt;<em>data-type</em>&lt;Sndr&gt;&gt;::<em>wrap-sender</em>.</code></p>
<h2 data-number="4.3" id="executionspawn_future-1"><span class="header-section-number">4.3</span>
<code class="sourceCode default">execution::spawn_future</code><a href="#executionspawn_future-1" class="self-link"></a></h2>
<p>To the subsection <span>33.9.12.18
<a href="https://wg21.link/exec.spawn.future">[exec.spawn.future]</a></span>,
make the following changes:</p>
<p><span class="marginalizedparent"><a class="marginalized">7</a></span>
Let <em><code class="sourceCode default">spawn-future-state</code></em>
be the exposition-only class template:</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a>namespace std::execution {</span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a>  template&lt;class Alloc, scope_token Token, sender Sender, class Env&gt;</span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true" tabindex="-1"></a>  struct <em>spawn-future-state</em>                                                 // <em>exposition only</em></span>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true" tabindex="-1"></a>    : <em>spawn-future-state-base</em>&lt;completion_signatures_of_t&lt;<em>future-spawned-sender</em>&lt;Sender, Env&gt;&gt;&gt; {</span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true" tabindex="-1"></a>    using <em>sigs-t</em> =                                                          // <em>exposition only</em></span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true" tabindex="-1"></a>      completion_signatures_of_t&lt;<em>future-spawned-sender</em>&lt;Sender, Env&gt;&gt;;</span>
<span id="cb13-7"><a href="#cb13-7" aria-hidden="true" tabindex="-1"></a>    using <em>receiver-t</em> =                                                      // <em>exposition only</em></span>
<span id="cb13-8"><a href="#cb13-8" aria-hidden="true" tabindex="-1"></a>      <em>spawn-future-receiver</em>&lt;<em>sigs-t</em>&gt;;</span>
<span id="cb13-9"><a href="#cb13-9" aria-hidden="true" tabindex="-1"></a>    using <em>op-t</em> =                                                            // <em>exposition only</em></span>
<span id="cb13-10"><a href="#cb13-10" aria-hidden="true" tabindex="-1"></a>      connect_result_t&lt;<em>future-spawned-sender</em>&lt;Sender, Env&gt;, <em>receiver-t</em>&gt;;</span>
<span id="cb13-11"><a href="#cb13-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb13-12"><a href="#cb13-12" aria-hidden="true" tabindex="-1"></a>    <em>spawn-future-state</em>(Alloc alloc, Sender&amp;&amp; sndr, Token token, Env env)    // <em>exposition only</em></span>
<span id="cb13-13"><a href="#cb13-13" aria-hidden="true" tabindex="-1"></a>      : <em>alloc</em>(std::move(alloc)),</span>
<span id="cb13-14"><a href="#cb13-14" aria-hidden="true" tabindex="-1"></a>        <em>op</em>(connect(</span>
<span id="cb13-15"><a href="#cb13-15" aria-hidden="true" tabindex="-1"></a>          write_env(<em>stop-when</em>(std::forward&lt;Sender&gt;(sndr), <em>ssource</em>.get_token()), std::move(env)),</span>
<span id="cb13-16"><a href="#cb13-16" aria-hidden="true" tabindex="-1"></a>          <em>receiver-t</em>(this))),</span>
<span id="cb13-17"><a href="#cb13-17" aria-hidden="true" tabindex="-1"></a>        <span class="rm" style="color: #bf0303"><del><em>token</em>(std::move(token)),</del></span></span>
<span id="cb13-18"><a href="#cb13-18" aria-hidden="true" tabindex="-1"></a>        <em>assoc<span class="rm" style="color: #bf0303"><del>iated</del></span></em>(token.try_associate()) {</span>
<span id="cb13-19"><a href="#cb13-19" aria-hidden="true" tabindex="-1"></a>          if (<span class="rm" style="color: #bf0303"><del>associated</del></span><span class="add" style="color: #006e28"><ins><em>assoc</em></ins></span>)</span>
<span id="cb13-20"><a href="#cb13-20" aria-hidden="true" tabindex="-1"></a>            start(<em>op</em>);</span>
<span id="cb13-21"><a href="#cb13-21" aria-hidden="true" tabindex="-1"></a>          else</span>
<span id="cb13-22"><a href="#cb13-22" aria-hidden="true" tabindex="-1"></a>            set_stopped(<em>receiver-t</em>(this));</span>
<span id="cb13-23"><a href="#cb13-23" aria-hidden="true" tabindex="-1"></a>        }</span>
<span id="cb13-24"><a href="#cb13-24" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb13-25"><a href="#cb13-25" aria-hidden="true" tabindex="-1"></a>    void <em>complete</em>() noexcept override;                                      // <em>exposition only</em></span>
<span id="cb13-26"><a href="#cb13-26" aria-hidden="true" tabindex="-1"></a>    void <em>consume</em>(receiver auto&amp; rcvr) noexcept;                             // <em>exposition only</em></span>
<span id="cb13-27"><a href="#cb13-27" aria-hidden="true" tabindex="-1"></a>    void <em>abandon</em>() noexcept;                                                // <em>exposition only</em></span>
<span id="cb13-28"><a href="#cb13-28" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb13-29"><a href="#cb13-29" aria-hidden="true" tabindex="-1"></a>  private:</span>
<span id="cb13-30"><a href="#cb13-30" aria-hidden="true" tabindex="-1"></a>    using <em>alloc-t</em> =                                                         // <em>exposition only</em></span>
<span id="cb13-31"><a href="#cb13-31" aria-hidden="true" tabindex="-1"></a>      typename allocator_traits&lt;Alloc&gt;::template rebind_alloc&lt;<em>spawn-future-state</em>&gt;;</span>
<span id="cb13-32"><a href="#cb13-32" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>using <em>assoc-t</em> =</ins></span>                                                         <span class="add" style="color: #006e28"><ins>// <em>exposition only</em></ins></span></span>
<span id="cb13-33"><a href="#cb13-33" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>remove_cvref_t&lt;decltype(declval&lt;Token&amp;&gt;().try_associate())&gt;;</ins></span></span>
<span id="cb13-34"><a href="#cb13-34" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb13-35"><a href="#cb13-35" aria-hidden="true" tabindex="-1"></a>    <em>alloc-t</em> <em>alloc</em>;                                                          // <em>exposition only</em></span>
<span id="cb13-36"><a href="#cb13-36" aria-hidden="true" tabindex="-1"></a>    <em>ssource-t</em> <em>ssource</em>;                                                      // <em>exposition only</em></span>
<span id="cb13-37"><a href="#cb13-37" aria-hidden="true" tabindex="-1"></a>    <em>op-t</em> <em>op</em>;                                                                // <em>exposition only</em></span>
<span id="cb13-38"><a href="#cb13-38" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>Token</del></span><span class="add" style="color: #006e28"><ins><em>assoc-t</em></ins></span> <em><span class="rm" style="color: #bf0303"><del>token</del></span><span class="add" style="color: #006e28"><ins>assoc</ins></span></em>;                                                // <em>exposition only</em></span>
<span id="cb13-39"><a href="#cb13-39" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>bool <em>associated</em>;</del></span>                                                        <span class="rm" style="color: #bf0303"><del>// <em>exposition only</em></del></span></span>
<span id="cb13-40"><a href="#cb13-40" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb13-41"><a href="#cb13-41" aria-hidden="true" tabindex="-1"></a>    void <em>destroy</em>() noexcept;                                                // <em>exposition only</em></span>
<span id="cb13-42"><a href="#cb13-42" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb13-43"><a href="#cb13-43" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p>…</p>
<p><code class="sourceCode default">void <em>destroy</em>() noexcept;</code></p>
<p><span class="marginalizedparent"><a class="marginalized">12</a></span>
<em>Effects:</em> Equivalent to:</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>auto token = std::move(this-&gt;<em>token</em>);</del></span></span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>bool associated = this-&gt;<em>associated</em>;</del></span></span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins>auto assoc = std::move(this-&gt;<em>assoc</em>);</ins></span></span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>{</del></span></span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>  </del></span>auto alloc = std::move(this-&gt;<em>alloc</em>);</span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>  </del></span>allocator_traits&lt;alloc-t&gt;::destroy(alloc, this);</span>
<span id="cb14-8"><a href="#cb14-8" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>  </del></span>allocator_traits&lt;alloc-t&gt;::deallocate(alloc, this, 1);</span>
<span id="cb14-9"><a href="#cb14-9" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>}</del></span></span>
<span id="cb14-10"><a href="#cb14-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb14-11"><a href="#cb14-11" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>if (associated)</del></span></span>
<span id="cb14-12"><a href="#cb14-12" aria-hidden="true" tabindex="-1"></a><span class="rm" style="color: #bf0303"><del>  token.disassociate();</del></span></span></code></pre></div>
<h2 data-number="4.4" id="executionspawn-2"><span class="header-section-number">4.4</span>
<code class="sourceCode default">execution::spawn</code><a href="#executionspawn-2" class="self-link"></a></h2>
<p>To the subsection <span>33.9.13.3
<a href="https://wg21.link/exec.spawn">[exec.spawn]</a></span>, make the
following changes:</p>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
Let spawn-state be the exposition-only class template:</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a>namespace std::execution {</span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a>  template&lt;class Alloc, scope_token Token, sender Sender&gt;</span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true" tabindex="-1"></a>  struct <em>spawn-state</em> : <em>spawn-state-base</em> {                   // <em>exposition only</em></span>
<span id="cb15-4"><a href="#cb15-4" aria-hidden="true" tabindex="-1"></a>    using <em>op-t</em> = connect_result_t&lt;Sender, <em>spawn-receiver</em>&gt;;  // <em>exposition only</em></span>
<span id="cb15-5"><a href="#cb15-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb15-6"><a href="#cb15-6" aria-hidden="true" tabindex="-1"></a>    <em>spawn-state</em>(Alloc alloc, Sender&amp;&amp; sndr, Token token);   // <em>exposition only</em></span>
<span id="cb15-7"><a href="#cb15-7" aria-hidden="true" tabindex="-1"></a>    void <em>complete</em>() noexcept override;                      // <em>exposition only</em></span>
<span id="cb15-8"><a href="#cb15-8" aria-hidden="true" tabindex="-1"></a>    void <em>run</em>()<span class="add" style="color: #006e28"><ins> noexcept</ins></span>;                                    // <em>exposition only</em></span>
<span id="cb15-9"><a href="#cb15-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb15-10"><a href="#cb15-10" aria-hidden="true" tabindex="-1"></a>  private:</span>
<span id="cb15-11"><a href="#cb15-11" aria-hidden="true" tabindex="-1"></a>    using <em>alloc-t</em> =                                         // <em>exposition only</em></span>
<span id="cb15-12"><a href="#cb15-12" aria-hidden="true" tabindex="-1"></a>      typename allocator_traits&lt;Alloc&gt;::template rebind_alloc&lt;<em>spawn-state</em>&gt;;</span>
<span id="cb15-13"><a href="#cb15-13" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>using <em>assoc-t</em> =</ins></span>                                         <span class="add" style="color: #006e28"><ins>// <em>exposition only</em></ins></span></span>
<span id="cb15-14"><a href="#cb15-14" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>remove_cvref_t&lt;decltype(declval&lt;Token&amp;&gt;().try_associate())&gt;;</ins></span></span>
<span id="cb15-15"><a href="#cb15-15" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb15-16"><a href="#cb15-16" aria-hidden="true" tabindex="-1"></a>    <em>alloc-t</em> <em>alloc</em>;                                          // <em>exposition only</em></span>
<span id="cb15-17"><a href="#cb15-17" aria-hidden="true" tabindex="-1"></a>    <em>op-t</em> <em>op</em>;                                                // <em>exposition only</em></span>
<span id="cb15-18"><a href="#cb15-18" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>Token</del></span><span class="add" style="color: #006e28"><ins><em>assoc-t</em></ins></span> <em><span class="rm" style="color: #bf0303"><del>token</del></span><span class="add" style="color: #006e28"><ins>assoc</ins></span></em>;                                // <em>exposition only</em></span>
<span id="cb15-19"><a href="#cb15-19" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb15-20"><a href="#cb15-20" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>void <em>destroy</em>() noexcept;</del></span>                                <span class="rm" style="color: #bf0303"><del>// <em>exposition only</em></del></span></span>
<span id="cb15-21"><a href="#cb15-21" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb15-22"><a href="#cb15-22" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p><code class="sourceCode default"><em>spawn-state</em>(Alloc alloc, Sender&amp;&amp; sndr, Token token);</code></p>
<p><span class="marginalizedparent"><a class="marginalized">6</a></span>
<em>Effects:</em> <span class="rm" style="color: #bf0303"><del>Initializes
<em><span><code class="sourceCode default">alloc</code></span></em> with
<span><code class="sourceCode default">alloc</code></span>,
<em><span><code class="sourceCode default">token</code></span></em> with
<span><code class="sourceCode default">token</code></span>, and
<em><span><code class="sourceCode default">op</code></span></em>
with:<br />
<span><code class="sourceCode default">  connect(std::move(sndr), <em>spawn-receiver</em>(this))</code></span></del></span>
<span class="add" style="color: #006e28"><ins>Initializes
<em><span><code class="sourceCode default">alloc</code></span></em> with
<span><code class="sourceCode default">std::move(alloc)</code></span>,
<em><span><code class="sourceCode default">op</code></span></em> with
<span><code class="sourceCode default">connect(std::move(sndr), <em>spawn-receiver</em>(this))</code></span>,
and <em><span><code class="sourceCode default">assoc</code></span></em>
with
<span><code class="sourceCode default">token.try_associate()</code></span>.</ins></span></p>
<p><code class="sourceCode default">void <em>run</em>()<span class="add" style="color: #006e28"><ins> noexcept</ins></span>;</code></p>
<p><span class="marginalizedparent"><a class="marginalized">7</a></span>
<em>Effects:</em> Equivalent to:</p>
<div class="sourceCode" id="cb16"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a>  if (<em>token</em>.try_associate())</span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a>    start(<em>op</em>);</span>
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true" tabindex="-1"></a>  else</span>
<span id="cb16-4"><a href="#cb16-4" aria-hidden="true" tabindex="-1"></a>    <em><span class="rm" style="color: #bf0303"><del>destroy</del></span><span class="add" style="color: #006e28"><ins>complete</ins></span></em>();</span></code></pre></div>
<p><code class="sourceCode default">void <em>complete</em>() noexcept override;</code></p>
<p><span class="marginalizedparent"><a class="marginalized">8</a></span>
<em>Effects:</em> Equivalent to:</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>auto token = std::move(this-&gt;<em>token</em>);</del></span></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del><em>destroy</em>();</del></span></span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb17-5"><a href="#cb17-5" aria-hidden="true" tabindex="-1"></a>  <span class="rm" style="color: #bf0303"><del>token.disassociate();</del></span></span></code></pre></div>
<p><span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">void <em>destroy</em>() noexcept;</code></span></del></span></p>
<p><span class="rm" style="color: #bf0303"><del><span class="marginalizedparent"><a class="marginalized">9</a></span>
<em>Effects:</em> Equivalent to:</del></span></p>
<div class="sourceCode" id="cb18"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>auto assoc = std::move(this-&gt;<em>assoc</em>);</ins></span></span>
<span id="cb18-2"><a href="#cb18-2" aria-hidden="true" tabindex="-1"></a>  auto alloc = std::move(this-&gt;<em>alloc</em>);</span>
<span id="cb18-3"><a href="#cb18-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb18-4"><a href="#cb18-4" aria-hidden="true" tabindex="-1"></a>  allocator_traits&lt;<em>alloc-t</em>&gt;::destroy(alloc, this);</span>
<span id="cb18-5"><a href="#cb18-5" aria-hidden="true" tabindex="-1"></a>  allocator_traits&lt;<em>alloc-t</em>&gt;::deallocate(alloc, this, 1);</span></code></pre></div>
<h2 data-number="4.5" id="async-scope-concepts"><span class="header-section-number">4.5</span> Async scope concepts<a href="#async-scope-concepts" class="self-link"></a></h2>
<p>At the beginning of subsection <span>33.14.1
<a href="https://wg21.link/exec.scope.concepts">[exec.scope.concepts]</a></span>,
make the following changes</p>
<p><span class="add" style="color: #006e28"><ins><span class="marginalizedparent"><a class="marginalized">1</a></span> The
<span><code class="sourceCode default">scope_assocation</code></span>
concept defines the requirements on a type
<span><code class="sourceCode default">Assoc</code></span> that, when
engaged, owns an association with an async scope.</ins></span></p>
<div class="sourceCode" id="cb19"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins>namespace std::execution {</ins></span></span>
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>template &lt;class Assoc&gt;</ins></span></span>
<span id="cb19-3"><a href="#cb19-3" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>concept scope_association =</ins></span></span>
<span id="cb19-4"><a href="#cb19-4" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>movable<Assoc> &amp;&amp;</ins></span></span>
<span id="cb19-5"><a href="#cb19-5" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>default_initializable<Assoc> &amp;&amp;</ins></span></span>
<span id="cb19-6"><a href="#cb19-6" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>requires(const Assoc assoc) {</ins></span></span>
<span id="cb19-7"><a href="#cb19-7" aria-hidden="true" tabindex="-1"></a>        <span class="add" style="color: #006e28"><ins>{ static_cast<bool>(assoc) } noexcept;</ins></span></span>
<span id="cb19-8"><a href="#cb19-8" aria-hidden="true" tabindex="-1"></a>        <span class="add" style="color: #006e28"><ins>{ assoc.try_associate() } -&gt; same_as<Assoc>;</ins></span></span>
<span id="cb19-9"><a href="#cb19-9" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>};</ins></span></span>
<span id="cb19-10"><a href="#cb19-10" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins>}</ins></span></span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
The <code class="sourceCode default">scope_token</code> concept defines
the requirements on a type <code class="sourceCode default">Token</code>
that can be used to create associations between senders and an async
scope.</p>
<p><span class="marginalizedparent"><a class="marginalized">3</a></span>
Let <em><code class="sourceCode default">test-sender</code></em> and
<em><code class="sourceCode default">test-env</code></em> be unspecified
types such that <code class="sourceCode default">sender_in&lt;<em>test-sender</em>, <em>test-env</em>&gt;</code>
is modeled.</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true" tabindex="-1"></a>namespace std::execution {</span>
<span id="cb20-2"><a href="#cb20-2" aria-hidden="true" tabindex="-1"></a>  template &lt;class Token&gt;</span>
<span id="cb20-3"><a href="#cb20-3" aria-hidden="true" tabindex="-1"></a>    concept scope_token =</span>
<span id="cb20-4"><a href="#cb20-4" aria-hidden="true" tabindex="-1"></a>      copyable&lt;Token&gt; &amp;&amp;</span>
<span id="cb20-5"><a href="#cb20-5" aria-hidden="true" tabindex="-1"></a>      requires(const Token token) {</span>
<span id="cb20-6"><a href="#cb20-6" aria-hidden="true" tabindex="-1"></a>        <span class="rm" style="color: #bf0303"><del>{ token.try_associate() } -&gt; same_as<bool>;</del></span></span>
<span id="cb20-7"><a href="#cb20-7" aria-hidden="true" tabindex="-1"></a>        <span class="rm" style="color: #bf0303"><del>{ token.disassociate() } noexcept -&gt; same_as<void>;</del></span></span>
<span id="cb20-8"><a href="#cb20-8" aria-hidden="true" tabindex="-1"></a>        <span class="add" style="color: #006e28"><ins>{ token.try_associate() } -&gt; scope_association;</ins></span></span>
<span id="cb20-9"><a href="#cb20-9" aria-hidden="true" tabindex="-1"></a>        { token.wrap(declval&lt;<em>test-sender</em>&gt;()) } -&gt; sender_in&lt;<em>test-env</em>&gt;;</span>
<span id="cb20-10"><a href="#cb20-10" aria-hidden="true" tabindex="-1"></a>      };</span>
<span id="cb20-11"><a href="#cb20-11" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<h2 data-number="4.6" id="executionsimple_counting_scope-and-executioncounting_scope"><span class="header-section-number">4.6</span>
<code class="sourceCode default">execution::simple_counting_scope</code>
and <code class="sourceCode default">execution::counting_scope</code><a href="#executionsimple_counting_scope-and-executioncounting_scope" class="self-link"></a></h2>
<p>To the subsection <span>33.14.2.2.1
<a href="https://wg21.link/exec.scope.simple.counting.general">[exec.scope.simple.counting.general]</a></span>,
make the following change:</p>
<div class="sourceCode" id="cb21"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a>namespace std::execution {</span>
<span id="cb21-2"><a href="#cb21-2" aria-hidden="true" tabindex="-1"></a>  class simple_counting_scope {</span>
<span id="cb21-3"><a href="#cb21-3" aria-hidden="true" tabindex="-1"></a>  public:</span>
<span id="cb21-4"><a href="#cb21-4" aria-hidden="true" tabindex="-1"></a>    // [exec.simple.counting.token], token</span>
<span id="cb21-5"><a href="#cb21-5" aria-hidden="true" tabindex="-1"></a>    struct token;</span>
<span id="cb21-6"><a href="#cb21-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb21-7"><a href="#cb21-7" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>// [exec.simple.counting.assoc], assoc</ins></span></span>
<span id="cb21-8"><a href="#cb21-8" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>struct assoc;</ins></span></span>
<span id="cb21-9"><a href="#cb21-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb21-10"><a href="#cb21-10" aria-hidden="true" tabindex="-1"></a>    static constexpr size_t max_associations = <em>implementation-defined</em>;</span>
<span id="cb21-11"><a href="#cb21-11" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb21-12"><a href="#cb21-12" aria-hidden="true" tabindex="-1"></a>    // [exec.simple.counting.ctor], constructor and destructor</span>
<span id="cb21-13"><a href="#cb21-13" aria-hidden="true" tabindex="-1"></a>    simple_counting_scope() noexcept;</span>
<span id="cb21-14"><a href="#cb21-14" aria-hidden="true" tabindex="-1"></a>    simple_counting_scope(simple_counting_scope&amp;&amp;) = delete;</span>
<span id="cb21-15"><a href="#cb21-15" aria-hidden="true" tabindex="-1"></a>    ~simple_counting_scope();</span>
<span id="cb21-16"><a href="#cb21-16" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb21-17"><a href="#cb21-17" aria-hidden="true" tabindex="-1"></a>    // [exec.simple.counting.mem], members</span>
<span id="cb21-18"><a href="#cb21-18" aria-hidden="true" tabindex="-1"></a>    token get_token() noexcept;</span>
<span id="cb21-19"><a href="#cb21-19" aria-hidden="true" tabindex="-1"></a>    void close() noexcept;</span>
<span id="cb21-20"><a href="#cb21-20" aria-hidden="true" tabindex="-1"></a>    sender auto join() noexcept;</span>
<span id="cb21-21"><a href="#cb21-21" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb21-22"><a href="#cb21-22" aria-hidden="true" tabindex="-1"></a>  private:</span>
<span id="cb21-23"><a href="#cb21-23" aria-hidden="true" tabindex="-1"></a>    size_t <em>count</em>;                                       // exposition only</span>
<span id="cb21-24"><a href="#cb21-24" aria-hidden="true" tabindex="-1"></a>    <em>scope-state-type</em> <em>state</em>;                             // exposition only</span>
<span id="cb21-25"><a href="#cb21-25" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb21-26"><a href="#cb21-26" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>bool</del></span><span class="add" style="color: #006e28"><ins>assoc</ins></span> <em>try-associate</em>() noexcept;                 // exposition only</span>
<span id="cb21-27"><a href="#cb21-27" aria-hidden="true" tabindex="-1"></a>    void <em>disassociate</em>() noexcept;                       // exposition only</span>
<span id="cb21-28"><a href="#cb21-28" aria-hidden="true" tabindex="-1"></a>    template&lt;class State&gt;</span>
<span id="cb21-29"><a href="#cb21-29" aria-hidden="true" tabindex="-1"></a>      bool <em>start-join-sender</em>(State&amp; state) noexcept;    // exposition only</span>
<span id="cb21-30"><a href="#cb21-30" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb21-31"><a href="#cb21-31" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<p>To the subsection <span>33.14.2.2.3
<a href="https://wg21.link/exec.simple.counting.mem">[exec.simple.counting.mem]</a></span>,
make the following changes:</p>
<p><code class="sourceCode default"><span class="rm" style="color: #bf0303"><del>bool</del></span><span class="add" style="color: #006e28"><ins>assoc</ins></span> <em>try-associate</em>() noexcept;</code></p>
<p><span class="marginalizedparent"><a class="marginalized">5</a></span>
<em>Effects:</em> If
<em><code class="sourceCode default">count</code></em> is equal to
<code class="sourceCode default">max_associations</code>, then no
effects. Otherwise, if
<em><code class="sourceCode default">state</code></em> is</p>
<ul>
<li><span class="marginalizedparent"><a class="marginalized">(5.1)</a></span>
<em><code class="sourceCode default">unused</code></em>, then increments
<em><code class="sourceCode default">count</code></em> and changes
<em><code class="sourceCode default">state</code></em> to
<em><code class="sourceCode default">open</code></em>;</li>
<li><span class="marginalizedparent"><a class="marginalized">(5.2)</a></span>
<em><code class="sourceCode default">open</code></em> or
<em><code class="sourceCode default">open-and-joining</code></em>, then
increments <em><code class="sourceCode default">count</code></em>;</li>
<li><span class="marginalizedparent"><a class="marginalized">(5.3)</a></span>
otherwise, no effects.</li>
</ul>
<p><span class="marginalizedparent"><a class="marginalized">6</a></span>
<em>Returns:</em> <span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">true</code></span>
if <em><span><code class="sourceCode default">count</code></span></em>
was incremented,
<span><code class="sourceCode default">false</code></span>
otherwise.</del></span> <span class="add" style="color: #006e28"><ins>An
object <span><code class="sourceCode default">a</code></span> of type
<span><code class="sourceCode default">simple_counting_scope::assoc</code></span>
such that
<span><code class="sourceCode default">a.<em>scope</em></code></span> is
<span><code class="sourceCode default">this</code></span> if
<em><span><code class="sourceCode default">count</code></span></em> was
incremented,
<span><code class="sourceCode default">nullptr</code></span>
otherwise.</ins></span></p>
<p>To the subsection <span>33.14.2.2.4
<a href="https://wg21.link/exec.simple.counting.token">[exec.simple.counting.token]</a></span>,
make the following changes:</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb22-1"><a href="#cb22-1" aria-hidden="true" tabindex="-1"></a>namespace std::execution {</span>
<span id="cb22-2"><a href="#cb22-2" aria-hidden="true" tabindex="-1"></a>  struct simple_counting_scope::token {</span>
<span id="cb22-3"><a href="#cb22-3" aria-hidden="true" tabindex="-1"></a>    template&lt;sender Sender&gt;</span>
<span id="cb22-4"><a href="#cb22-4" aria-hidden="true" tabindex="-1"></a>      Sender&amp;&amp; wrap(Sender&amp;&amp; snd) const noexcept;</span>
<span id="cb22-5"><a href="#cb22-5" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>bool</del></span><span class="add" style="color: #006e28"><ins>assoc</ins></span> try_associate() const noexcept;</span>
<span id="cb22-6"><a href="#cb22-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb22-7"><a href="#cb22-7" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>void disassociate() const noexcept;</del></span></span>
<span id="cb22-8"><a href="#cb22-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb22-9"><a href="#cb22-9" aria-hidden="true" tabindex="-1"></a>  private:</span>
<span id="cb22-10"><a href="#cb22-10" aria-hidden="true" tabindex="-1"></a>    simple_counting_scope* <em>scope</em>;   // exposition only</span>
<span id="cb22-11"><a href="#cb22-11" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb22-12"><a href="#cb22-12" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<div class="sourceCode" id="cb23"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a>template &lt;sender Sender&gt;</span>
<span id="cb23-2"><a href="#cb23-2" aria-hidden="true" tabindex="-1"></a>  Sender&amp;&amp; wrap(Sender&amp;&amp; snd) const noexcept;</span></code></pre></div>
<p><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Returns:</em>
<code class="sourceCode default">std::forward&lt;Sender&gt;(snd)</code>.</p>
<p><code class="sourceCode default"><span class="rm" style="color: #bf0303"><del>bool</del></span><span class="add" style="color: #006e28"><ins>assoc</ins></span> try_associate() const noexcept;</code></p>
<p><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Effects:</em> Equivalent to: <code class="sourceCode default">return <em>scope</em>-&gt;<em>try-associate</em>();</code></p>
<p><span class="rm" style="color: #bf0303"><del><span><code class="sourceCode default">void disassociate() const noexcept;</code></span></del></span></p>
<p><span class="rm" style="color: #bf0303"><del><span class="marginalizedparent"><a class="marginalized">3</a></span>
<em>Effects:</em> Equivalent to
<span><code class="sourceCode default"><em>scope</em>-&gt;<em>disassociate</em>()</code></span>.</del></span></p>
<p>Add the following new section immediately after <span>33.14.2.2.4
<a href="https://wg21.link/exec.simple.counting.token">[exec.simple.counting.token]</a></span>:</p>
<p><span class="add" style="color: #006e28"><ins><strong>Association
[exec.simple.counting.assoc]</strong></ins></span></p>
<div class="sourceCode" id="cb24"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins>namespace std::execution {</ins></span></span>
<span id="cb24-2"><a href="#cb24-2" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>struct simple_counting_scope::assoc {</ins></span></span>
<span id="cb24-3"><a href="#cb24-3" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>explicit operator bool() const noexcept;</ins></span></span>
<span id="cb24-4"><a href="#cb24-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb24-5"><a href="#cb24-5" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>assoc try_associate() const noexcept;</ins></span></span>
<span id="cb24-6"><a href="#cb24-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb24-7"><a href="#cb24-7" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>private:</ins></span></span>
<span id="cb24-8"><a href="#cb24-8" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>using <em>handle</em> = // <em>exposition only</em></ins></span></span>
<span id="cb24-9"><a href="#cb24-9" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>unique_ptr&lt;simple_counting_scope, decltype([](auto* p) noexcept {</ins></span></span>
<span id="cb24-10"><a href="#cb24-10" aria-hidden="true" tabindex="-1"></a>        <span class="add" style="color: #006e28"><ins>p-&gt;<em>disassociate</em>();</ins></span></span>
<span id="cb24-11"><a href="#cb24-11" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>})&gt;;</ins></span></span>
<span id="cb24-12"><a href="#cb24-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb24-13"><a href="#cb24-13" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins><em>handle</em> <em>scope</em>; // <em>exposition only</em></ins></span></span>
<span id="cb24-14"><a href="#cb24-14" aria-hidden="true" tabindex="-1"></a>  <span class="add" style="color: #006e28"><ins>};</ins></span></span>
<span id="cb24-15"><a href="#cb24-15" aria-hidden="true" tabindex="-1"></a><span class="add" style="color: #006e28"><ins>}</ins></span></span></code></pre></div>
<p><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">explicit operator bool() const noexcept;</code></span></ins></span></p>
<p><span class="add" style="color: #006e28"><ins><span class="marginalizedparent"><a class="marginalized">1</a></span>
<em>Returns:</em>
<span><code class="sourceCode default"><em>scope</em> != nullptr</code></span></ins></span></p>
<p><span class="add" style="color: #006e28"><ins><span><code class="sourceCode default">assoc try_associate() const noexcept;</code></span></ins></span></p>
<p><span class="add" style="color: #006e28"><ins><span class="marginalizedparent"><a class="marginalized">2</a></span>
<em>Returns:</em> A default-initialized
<span><code class="sourceCode default">assoc</code></span> if
<em><span><code class="sourceCode default">scope</code></span></em> is
<span><code class="sourceCode default">nullptr</code></span>,
<span><code class="sourceCode default"><em>scope</em>-&gt;<em>try-associate</em>()</code></span>
otherwise.</ins></span></p>
<p>To the subsection <span>33.14.2.3
<a href="https://wg21.link/exec.scope.counting">[exec.scope.counting]</a></span>,
make the following changes:</p>
<div class="sourceCode" id="cb25"><pre class="sourceCode default"><code class="sourceCode default"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a>namespace std::execution {</span>
<span id="cb25-2"><a href="#cb25-2" aria-hidden="true" tabindex="-1"></a>  class counting_scope {</span>
<span id="cb25-3"><a href="#cb25-3" aria-hidden="true" tabindex="-1"></a>  public:</span>
<span id="cb25-4"><a href="#cb25-4" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>struct assoc {</ins></span></span>
<span id="cb25-5"><a href="#cb25-5" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>explicit operator bool() const noexcept;</ins></span></span>
<span id="cb25-6"><a href="#cb25-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-7"><a href="#cb25-7" aria-hidden="true" tabindex="-1"></a>      <span class="add" style="color: #006e28"><ins>assoc try_associate() const noexcept;</ins></span></span>
<span id="cb25-8"><a href="#cb25-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-9"><a href="#cb25-9" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>private:</ins></span></span>
<span id="cb25-10"><a href="#cb25-10" aria-hidden="true" tabindex="-1"></a>      [using _handle_ = // _exposition\ only_]{.add}</span>
<span id="cb25-11"><a href="#cb25-11" aria-hidden="true" tabindex="-1"></a>        <span class="add" style="color: #006e28"><ins>unique_ptr&lt;counting_scope, decltype([](auto* p) noexcept {</ins></span></span>
<span id="cb25-12"><a href="#cb25-12" aria-hidden="true" tabindex="-1"></a>          [p-&gt;_disassociate_();]{.add}</span>
<span id="cb25-13"><a href="#cb25-13" aria-hidden="true" tabindex="-1"></a>        <span class="add" style="color: #006e28"><ins>})&gt;;</ins></span></span>
<span id="cb25-14"><a href="#cb25-14" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-15"><a href="#cb25-15" aria-hidden="true" tabindex="-1"></a>      [_handle_ _scope_; // _exposition\ only_]{.add}</span>
<span id="cb25-16"><a href="#cb25-16" aria-hidden="true" tabindex="-1"></a>    <span class="add" style="color: #006e28"><ins>};</ins></span></span>
<span id="cb25-17"><a href="#cb25-17" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-18"><a href="#cb25-18" aria-hidden="true" tabindex="-1"></a>    struct token {</span>
<span id="cb25-19"><a href="#cb25-19" aria-hidden="true" tabindex="-1"></a>      template&lt;sender Sender&gt;</span>
<span id="cb25-20"><a href="#cb25-20" aria-hidden="true" tabindex="-1"></a>        sender auto wrap(Sender&amp;&amp; snd) const noexcept(see below);</span>
<span id="cb25-21"><a href="#cb25-21" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>bool</del></span><span class="add" style="color: #006e28"><ins>assoc</ins></span> try_associate() const noexcept;</span>
<span id="cb25-22"><a href="#cb25-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-23"><a href="#cb25-23" aria-hidden="true" tabindex="-1"></a>      <span class="rm" style="color: #bf0303"><del>void disassociate() const noexcept;</del></span></span>
<span id="cb25-24"><a href="#cb25-24" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-25"><a href="#cb25-25" aria-hidden="true" tabindex="-1"></a>    private:</span>
<span id="cb25-26"><a href="#cb25-26" aria-hidden="true" tabindex="-1"></a>      counting_scope* <em>scope</em>;                            // exposition only</span>
<span id="cb25-27"><a href="#cb25-27" aria-hidden="true" tabindex="-1"></a>    };</span>
<span id="cb25-28"><a href="#cb25-28" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-29"><a href="#cb25-29" aria-hidden="true" tabindex="-1"></a>    static constexpr size_t max_associations = implementation-defined;</span>
<span id="cb25-30"><a href="#cb25-30" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-31"><a href="#cb25-31" aria-hidden="true" tabindex="-1"></a>    counting_scope() noexcept;</span>
<span id="cb25-32"><a href="#cb25-32" aria-hidden="true" tabindex="-1"></a>    counting_scope(counting_scope&amp;&amp;) = delete;</span>
<span id="cb25-33"><a href="#cb25-33" aria-hidden="true" tabindex="-1"></a>    ~counting_scope();</span>
<span id="cb25-34"><a href="#cb25-34" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-35"><a href="#cb25-35" aria-hidden="true" tabindex="-1"></a>    token get_token() noexcept;</span>
<span id="cb25-36"><a href="#cb25-36" aria-hidden="true" tabindex="-1"></a>    void close() noexcept;</span>
<span id="cb25-37"><a href="#cb25-37" aria-hidden="true" tabindex="-1"></a>    sender auto join() noexcept;</span>
<span id="cb25-38"><a href="#cb25-38" aria-hidden="true" tabindex="-1"></a>    void request_stop() noexcept;</span>
<span id="cb25-39"><a href="#cb25-39" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-40"><a href="#cb25-40" aria-hidden="true" tabindex="-1"></a>  private:</span>
<span id="cb25-41"><a href="#cb25-41" aria-hidden="true" tabindex="-1"></a>    size_t <em>count</em>;                                       // exposition only</span>
<span id="cb25-42"><a href="#cb25-42" aria-hidden="true" tabindex="-1"></a>    <em>scope-state-type</em> <em>state</em>;                             // exposition only</span>
<span id="cb25-43"><a href="#cb25-43" aria-hidden="true" tabindex="-1"></a>    inplace_stop_source <em>s_source</em>;                       // exposition only</span>
<span id="cb25-44"><a href="#cb25-44" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-45"><a href="#cb25-45" aria-hidden="true" tabindex="-1"></a>    <span class="rm" style="color: #bf0303"><del>bool</del></span><span class="add" style="color: #006e28"><ins>assoc</ins></span> <em>try-associate</em>() noexcept;                 // exposition only</span>
<span id="cb25-46"><a href="#cb25-46" aria-hidden="true" tabindex="-1"></a>    void <em>disassociate</em>() noexcept;                       // exposition only</span>
<span id="cb25-47"><a href="#cb25-47" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb25-48"><a href="#cb25-48" aria-hidden="true" tabindex="-1"></a>    template&lt;class State&gt;</span>
<span id="cb25-49"><a href="#cb25-49" aria-hidden="true" tabindex="-1"></a>      bool <em>start-join-sender</em>(State&amp; state) noexcept;    // exposition only</span>
<span id="cb25-50"><a href="#cb25-50" aria-hidden="true" tabindex="-1"></a>  };</span>
<span id="cb25-51"><a href="#cb25-51" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<h1 data-number="5" id="bibliography"><span class="header-section-number">5</span> References<a href="#bibliography" class="self-link"></a></h1>
<div id="refs" class="references csl-bib-body hanging-indent" role="doc-bibliography">
<div id="ref-P3149R11" class="csl-entry" role="doc-biblioentry">
[P3149R11] Ian Petersen, Jessica Wong; Dietmar Kühl; Ján Ondrušek; Kirk
Shoop; Lee Howes; Lucian Radu Teodorescu; Ruslan Arutyunyan; 2025-06-19.
async_scope — Creating scopes for non-sequential concurrency. <a href="https://wg21.link/p3149r11"><div class="csl-block">https://wg21.link/p3149r11</div></a>
</div>
<div id="ref-P3149R7" class="csl-entry" role="doc-biblioentry">
[P3149R7] Ian Petersen, Jessica Wong; Dietmar Kühl; Ján Ondrušek; Kirk
Shoop; Lee Howes; Lucian Radu Teodorescu; Ruslan Arutyunyan; 2024-11-18.
async_scope — Creating scopes for non-sequential concurrency. <a href="https://wg21.link/p3149r7"><div class="csl-block">https://wg21.link/p3149r7</div></a>
</div>
</div>
</div>
</div>
</body>
</html>
