@@ -13,7 +13,19 @@ namespace std::execution {
13
13
* unspecified[italic]
14
14
15
15
## 概要
16
- `as_awaitable`は、オブジェクトを特定コルーチン内でAwaitableに変換するカスタマイゼーションポイントオブジェクトである。
16
+ `as_awaitable`は、オブジェクトを特定の[コルーチン](/lang/cpp20/coroutines.md)内でAwaitableに変換するカスタマイゼーションポイントオブジェクトである。
17
+
18
+ Promise型`p`をもつコルーチンにおいて、Await式`co_await as_awaitable(expr, p)`は下記のように動作する。
19
+
20
+ - 式`expr.as_awaitable(p)`が有効ならば、同式が返すAwaitableオブジェクトに対してAwait式を実行する。
21
+ - `expr`が[単一の値を送信するSender](single-sender.md)であり、Promise型が停止完了ハンドラを定義するならば、下記動作を行う。
22
+ - Senderを[接続(connect)](connect.md)し、結果[Operation State](operation_state.md)をAwaitableオブジェクトに格納する。
23
+ - コルーチンを中断し、Operation Stateを[開始(start)](start.md)する。
24
+ - [クエリオブジェクト](../queryable.md)による[Receiver](receiver.md)環境への問い合わせは、Promise型に関連付けられた環境(`get_env`)へと転送される。
25
+ - Senderが[値完了](set_value.md)した場合、送信値をAwait式の結果としてコルーチンを再開する。
26
+ - Senderが[エラー完了](set_error.md)した場合、エラー値を例外としてコルーチンから再スローする。
27
+ - Senderが[停止完了](set_stopped.md)した場合、停止完了ハンドラ(`unhandled_stopped`)が返す別のコルーチンを再開させる。
28
+ - そうでなければ、式`expr`に対してAwait式を実行する。
17
29
18
30
19
31
## 効果
@@ -43,6 +55,7 @@ namespace std::execution {
43
55
}
44
56
```
45
57
* single-sender[ link single-sender.md]
58
+ * env_of_t[ link env_of_t.md]
46
59
* sender_to[ link sender_to.md]
47
60
* convertible_to[ link /reference/concepts/convertible_to.md]
48
61
* coroutine_handle<>[ link /reference/coroutine/coroutine_handle.md]
@@ -102,7 +115,7 @@ struct awaitable-receiver {
102
115
103
116
説明用の式` rcvr ` を` awaitable-reciever ` 型の右辺値、` crcvr ` を` rcvr ` をconst参照する左辺値、` vs ` を式パック、` err ` を` Err ` 型の式とする。このとき
104
117
105
- - [ ` constructible_from ` ] ( /reference/concepts/constructible_from.md ) ` <result-type, decltype((vs))...> ` を満たすとき、式` set_value(rcvr, vs...) ` は下記と等価。そうでなければ、式` set_value(rcvr, vs...) ` は不適格となる。
118
+ - [ ` constructible_from ` ] ( /reference/concepts/constructible_from.md ) ` <result-type, decltype((vs))...> ` を満たすとき、式[ ` set_value ` ] ( set_value.md ) ` (rcvr, vs...) ` は下記と等価。そうでなければ、式` set_value(rcvr, vs...) ` は不適格となる。
106
119
107
120
``` cpp
108
121
try {
@@ -116,7 +129,7 @@ struct awaitable-receiver {
116
129
* current_exception()[link /reference/exception/current_exception.md]
117
130
* resume()[link /reference/coroutine/coroutine_handle/resume.md]
118
131
119
- - 式` set_error(rcvr, err) ` は下記と等価。
132
+ - 式[ ` set_error ` ] ( set_error.md ) ` (rcvr, err) ` は下記と等価。
120
133
121
134
``` cpp
122
135
rcvr.result-ptr->template emplace<2 >(AS-EXCEPT-PTR(err));
@@ -125,7 +138,7 @@ struct awaitable-receiver {
125
138
* template emplace[link /reference/variant/variant/emplace.md]
126
139
* resume ()[link /reference/coroutine/coroutine_handle/resume.md]
127
140
128
- - 式`set_stopped(rcvr)`は下記と等価。
141
+ - 式[ `set_stopped`](set_stopped.md) ` (rcvr) ` は下記と等価。
129
142
130
143
```cpp
131
144
static_cast<coroutine_handle<>>(rcvr.continuation.promise().unhandled_stopped()).resume();
@@ -134,7 +147,7 @@ struct awaitable-receiver {
134
147
* promise()[link /reference/coroutine/coroutine_handle/promise.md]
135
148
* resume()[link /reference/coroutine/coroutine_handle/resume.md]
136
149
137
- - [ ` forwarding-query ` ] ( ../forwarding-query.md ) を満たす型の式` tag ` とパック式` as ` に対して、[ ` get_env ` ] ( get_env.md ) ` (crcvr).query(tag, as...) ` は下記と等価。
150
+ - [ ` forwarding-query ` ] ( ../forwarding-query.md ) を満たす型の式` tag ` とパック式` as ` に対して、式 [ ` get_env ` ] ( get_env.md ) ` (crcvr).query(tag, as...) ` は下記と等価。
138
151
139
152
``` cpp
140
153
tag (get_env(as_const(crcvr.continuation.promise())), as...)
0 commit comments