@@ -5491,7 +5491,10 @@ template<class Initializer>
5491
5491
associated environment is equal to the environment associated with the
5492
5492
receiver used to create it. The lifetime of an asynchronous operation's
5493
5493
associated operation state does not depend on the lifetimes of either the
5494
- sender or the receiver from which it was created. A sender <dfn lt="send"
5494
+ sender or the receiver from which it was created. A sender is started when
5495
+ it is connected to a receiver and the resulting asynchronous operation is
5496
+ started. A sender's async result is the async result of an asynchronous
5497
+ operation created by connecting it to a receiver. A sender <dfn lt="send"
5495
5498
export=true> sends</dfn> its results by way of the asynchronous operation(s)
5496
5499
it produces, and a receiver <dfn lt="receive" export=true>receives</dfn>
5497
5500
those results. A sender is either valid or invalid; it becomes invalid
@@ -7847,12 +7850,19 @@ namespace std::execution {
7847
7850
execution back to the execution resource on which `sndr` completed.
7848
7851
7849
7852
2. The name `on` denotes a pipeable sender adaptor object. For subexpressions
7850
- `sch` and `sndr`, if `decltype((sch))` does not satisfy `scheduler`, or
7851
- `decltype((sndr))` does not satisfy `sender`, `on(sch, sndr)` is ill-formed.
7852
- If `sndr` is a pipeable sender adaptor closure object, `on(sch, sndr)` is
7853
- ambiguous with the partial application of the overload described below.
7853
+ `sch` and `sndr`, `on(sch, sndr)` is ill-formed if any of the following
7854
+ are `true`:
7855
+
7856
+ * If `decltype((sch))` does not satisfy `scheduler`, or
7857
+
7858
+ * If `decltype((sndr))` does not satisfy `sender` and `sndr` is not
7859
+ a pipeable sender adaptor closure object ([exec.adapt.objects] ), or
7860
+
7861
+ * If `decltype((sndr))` satisfies `sender` and `sndr` is also
7862
+ a pipeable sender adaptor closure object.
7854
7863
7855
- 3. Otherwise, the expression `on(sch, sndr)` is expression-equivalent to:
7864
+ 3. Otherwise, if `decltype((sndr))` satisfies `sender`, the expression `on(sch,
7865
+ sndr)` is expression-equivalent to:
7856
7866
7857
7867
<pre highlight="c++">
7858
7868
transform_sender(
@@ -9467,7 +9477,7 @@ namespace std::execution {
9467
9477
9468
9478
## Execution contexts <b> [exec.ctx] </b> ## {#spec-execution.contexts}
9469
9479
9470
- ### `run_loop` <b> [exec.run.loop] </b> ### {#spec-execution.contexts.run_loop}
9480
+ ### `execution:: run_loop` <b> [exec.run.loop] </b> ### {#spec-execution.contexts.run_loop}
9471
9481
9472
9482
1. A `run_loop` is an execution resource on which work can be scheduled. It
9473
9483
maintains a thread-safe first-in-first-out queue of work. Its `run()`
@@ -9822,7 +9832,7 @@ void finish();
9822
9832
* <i> Mandates:</i> <code><i> is-awaitable</i> <A, Promise></code> is
9823
9833
`true`, where `A` is the type of the expression above.
9824
9834
9825
- 2. Otherwise, `void(p), expr` if <code><i> is-awaitable</i> <Expr, <i> U</i> ></code>
9835
+ 2. Otherwise, `( void(p), expr) ` if <code><i> is-awaitable</i> <Expr, <i> U</i> ></code>
9826
9836
is `true`, where <i> `U`</i> is an unspecified class type that
9827
9837
is not `Promise` and that lacks a member named `await_transform`.
9828
9838
@@ -9835,7 +9845,7 @@ void finish();
9835
9845
3. Otherwise, <code><i> sender-awaitable</i> {expr, p}</code> if
9836
9846
<code><i> awaitable-sender</i> <Expr, Promise></code> is `true`.
9837
9847
9838
- 4. Otherwise, `void(p), expr`.
9848
+ 4. Otherwise, `( void(p), expr) `.
9839
9849
9840
9850
except that the evaluations of `expr` and `p` are indeterminately sequenced.
9841
9851
0 commit comments