200
200
201
201
< p class ="text-right "> < small >
202
202
最終更新日時(UTC):
203
- < span itemprop ="datePublished " content ="2025-04-18T07:44:08 ">
204
- 2025年04月18日 07時44分08秒
203
+ < span itemprop ="datePublished " content ="2025-04-18T08:15:49 ">
204
+ 2025年04月18日 08時15分49秒
205
205
</ span >
206
206
< br />
207
207
< span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
@@ -235,8 +235,8 @@ <h2>概要</h2>
235
235
< p > < code > connect</ code > は、< a href ="sender.html "> Sender</ a > と< a href ="receiver.html "> Receiver</ a > を接続した結果< a href ="operation_state.html "> Operation State</ a > を返す< a class ="cpprefjp-defined-word " data-desc ="プログラム定義型に対するオーバーロードが許されている標準関数名について、中でいい感じにオーバーロード解決して呼び出してくれる関数オブジェクト "> カスタマイゼーションポイントオブジェクト</ a > である。</ p >
236
236
< p > < a class ="cpprefjp-defined-word " data-desc ="プログラム定義型に対するオーバーロードが許されている標準関数名について、中でいい感じにオーバーロード解決して呼び出してくれる関数オブジェクト "> カスタマイゼーションポイントオブジェクト</ a > の呼び出し式< code > connect(sndr, rcvr)</ code > は、下記の動作となる。</ p >
237
237
< ul >
238
- < li > < code > < a href ="transform_sender.html "> transform_sender</ a > </ code > を呼び出して、 < code > sndr</ code > を新しいSender < code > new_sndr</ code > に変換する。大半のケースでは無変換。 </ li >
239
- < li > 呼び出し式が< a class ="cpprefjp-defined-word " data-desc ="プログラムが文法規則・診断対象の意味規則・単一定義規則を満たすこと " href ="../../../implementation-compliance.html#dfn-well-formed "> 適格</ a > であるならば、< code > return new_sndr.connect(rcvr)</ code > 相当 。</ li >
238
+ < li > < code > < a href ="transform_sender.html "> transform_sender</ a > </ code > により < code > sndr</ code > から新しいSender < code > new_sndr</ code > へ変換する。(多くのケースで無変換) </ li >
239
+ < li > 呼び出し式が< a class ="cpprefjp-defined-word " data-desc ="プログラムが文法規則・診断対象の意味規則・単一定義規則を満たすこと " href ="../../../implementation-compliance.html#dfn-well-formed "> 適格</ a > であるならば、< code > new_sndr.connect(rcvr)</ code > を返す 。</ li >
240
240
< li > そうでなければ、< code > new_sndr</ code > を< a href ="../../../lang/cpp20/coroutines.html "> コルーチンのAwaitable型</ a > とみなして< code > rcvr</ code > と接続した結果を返す。</ li >
241
241
</ ul >
242
242
< h2 > 効果</ h2 >
@@ -254,16 +254,16 @@ <h3>Awaitable接続用へルパ</h3>
254
254
< p > 説明用のクラス< code > connect-awaitable-promise</ code > , < code > operation-state-task</ code > をそれぞれ下記の通り定義する。</ p >
255
255
< p > 型< code > DS</ code > を< code > < a href ="../../type_traits/decay.html "> decay_t</ a > <decltype((new_sndr))></ code > 、型< code > DR</ code > を< code > < a href ="../../type_traits/decay.html "> decay_t</ a > <Rcvr></ code > とする。</ p >
256
256
< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="k "> namespace</ span > < span class ="n "> std</ span > < span class ="o "> ::</ span > < span class ="n "> execution</ span > < span class ="p "> {</ span >
257
- < span class ="k "> struct</ span > < span class ="n "> connect</ span > < span class ="o "> -</ span > < span class ="n "> awaitable</ span > < span class ="o "> -</ span > < span class ="nl "> promise</ span > < span class ="p "> :</ span > < span class ="n "> with </ span > < span class =" o " > - </ span > < span class =" n " > await</ span > < span class =" o " > - </ span > < span class =" n " > transform </ span > < span class ="o "> <</ span > < span class ="n "> connect</ span > < span class ="o "> -</ span > < span class ="n "> awaitable</ span > < span class ="o "> -</ span > < span class ="n "> promise</ span > < span class ="o "> ></ span > < span class ="p "> {</ span >
257
+ < span class ="k "> struct</ span > < span class ="n "> connect</ span > < span class ="o "> -</ span > < span class ="n "> awaitable</ span > < span class ="o "> -</ span > < span class ="nl "> promise</ span > < span class ="p "> :</ span > < span class ="n "> < a href =" with- await-transform.html " > with-await-transform </ a > </ span > < span class ="o "> <</ span > < span class ="n "> connect</ span > < span class ="o "> -</ span > < span class ="n "> awaitable</ span > < span class ="o "> -</ span > < span class ="n "> promise</ span > < span class ="o "> ></ span > < span class ="p "> {</ span >
258
258
< span class ="n "> connect</ span > < span class ="o "> -</ span > < span class ="n "> awaitable</ span > < span class ="o "> -</ span > < span class ="n "> promise</ span > < span class ="p "> (</ span > < span class ="n "> DS</ span > < span class ="o "> &</ span > < span class ="p "> ,</ span > < span class ="n "> DR</ span > < span class ="o "> &</ span > < span class ="n "> rcvr</ span > < span class ="p "> )</ span > < span class ="k "> noexcept</ span > < span class ="o "> :</ span > < span class ="n "> rcvr</ span > < span class ="p "> (</ span > < span class ="n "> rcvr</ span > < span class ="p "> )</ span > < span class ="p "> {}</ span >
259
259
260
260
< span class ="n "> < a href ="../../coroutine/suspend_always.html "> suspend_always</ a > </ span > < span class ="n "> initial_suspend</ span > < span class ="p "> ()</ span > < span class ="k "> noexcept</ span > < span class ="p "> {</ span > < span class ="k "> return</ span > < span class ="p "> {};</ span > < span class ="p "> }</ span >
261
- < span class ="p "> [[</ span > < span class ="n "> noreturn</ span > < span class ="p "> ]]</ span > < span class ="n "> < a href ="../../coroutine/suspend_always.html "> suspend_always</ a > </ span > < span class ="n "> final_suspend</ span > < span class ="p "> ()</ span > < span class ="k "> noexcept</ span > < span class ="p "> {</ span > < span class ="n "> terminate</ span > < span class ="p "> () ;</ span > < span class ="p "> }</ span >
262
- < span class ="p "> [[</ span > < span class ="n "> noreturn</ span > < span class ="p "> ]]</ span > < span class ="kt "> void</ span > < span class ="n "> unhandled_exception</ span > < span class ="p "> ()</ span > < span class ="k "> noexcept</ span > < span class ="p "> {</ span > < span class ="n "> terminate</ span > < span class ="p "> () ;</ span > < span class ="p "> }</ span >
263
- < span class ="p "> [[</ span > < span class ="n "> noreturn</ span > < span class ="p "> ]]</ span > < span class ="kt "> void</ span > < span class ="n "> return_void</ span > < span class ="p "> ()</ span > < span class ="k "> noexcept</ span > < span class ="p "> {</ span > < span class ="n "> terminate</ span > < span class ="p "> () ;</ span > < span class ="p "> }</ span >
261
+ < span class ="p "> [[</ span > < span class ="n "> noreturn</ span > < span class ="p "> ]]</ span > < span class ="n "> < a href ="../../coroutine/suspend_always.html "> suspend_always</ a > </ span > < span class ="n "> final_suspend</ span > < span class ="p "> ()</ span > < span class ="k "> noexcept</ span > < span class ="p "> {</ span > < span class ="n "> < a href =" ../../exception/ terminate.html " > terminate() </ a > </ span > < span class ="p "> ;</ span > < span class ="p "> }</ span >
262
+ < span class ="p "> [[</ span > < span class ="n "> noreturn</ span > < span class ="p "> ]]</ span > < span class ="kt "> void</ span > < span class ="n "> unhandled_exception</ span > < span class ="p "> ()</ span > < span class ="k "> noexcept</ span > < span class ="p "> {</ span > < span class ="n "> < a href =" ../../exception/ terminate.html " > terminate() </ a > </ span > < span class ="p "> ;</ span > < span class ="p "> }</ span >
263
+ < span class ="p "> [[</ span > < span class ="n "> noreturn</ span > < span class ="p "> ]]</ span > < span class ="kt "> void</ span > < span class ="n "> return_void</ span > < span class ="p "> ()</ span > < span class ="k "> noexcept</ span > < span class ="p "> {</ span > < span class ="n "> < a href =" ../../exception/ terminate.html " > terminate() </ a > </ span > < span class ="p "> ;</ span > < span class ="p "> }</ span >
264
264
265
265
< span class ="n "> < a href ="../../coroutine/coroutine_handle.html "> coroutine_handle</ a > </ span > < span class ="o "> <></ span > < span class ="n "> unhandled_stopped</ span > < span class ="p "> ()</ span > < span class ="k "> noexcept</ span > < span class ="p "> {</ span >
266
- < span class ="n "> < a href ="set_stopped.html "> set_stopped</ a > </ span > < span class ="p "> (</ span > < span class ="n "> std </ span > < span class =" o " > :: </ span > < span class =" n " > move </ span > < span class ="p "> (</ span > < span class ="n "> rcvr</ span > < span class ="p "> ));</ span >
266
+ < span class ="n "> < a href ="set_stopped.html "> set_stopped</ a > </ span > < span class ="p "> (</ span > < span class ="n "> < a href =" ../../utility/move.html " > std::move </ a > </ span > < span class ="p "> (</ span > < span class ="n "> rcvr</ span > < span class ="p "> ));</ span >
267
267
< span class ="k "> return</ span > < span class ="n "> < a href ="../../coroutine/noop_coroutine.html "> noop_coroutine()</ a > </ span > < span class ="p "> ;</ span >
268
268
< span class ="p "> }</ span >
269
269
@@ -285,7 +285,7 @@ <h3>Awaitable接続用へルパ</h3>
285
285
< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="k "> namespace</ span > < span class ="n "> std</ span > < span class ="o "> ::</ span > < span class ="n "> execution</ span > < span class ="p "> {</ span >
286
286
< span class ="k "> struct</ span > < span class ="n "> operation</ span > < span class ="o "> -</ span > < span class ="n "> state</ span > < span class ="o "> -</ span > < span class ="n "> task</ span > < span class ="p "> {</ span > < span class ="c1 "> // exposition only</ span >
287
287
< span class ="k "> using</ span > < span class ="n "> operation_state_concept</ span > < span class ="o "> =</ span > < span class ="n "> < a href ="operation_state.html "> operation_state_t</ a > </ span > < span class ="p "> ;</ span >
288
- < span class ="k "> using</ span > < span class ="n "> promise_type</ span > < span class ="o "> =</ span > < span class ="n "> connect</ span > < span class ="o "> -</ span > < span class ="n "> awaitable</ span > < span class ="o "> -</ span > < span class ="n "> promise</ span > < span class ="p "> ;</ span >
288
+ < span class ="k "> using</ span > < span class ="n "> < a href =" ../../../lang/cpp20/coroutines.html " > promise_type</ a > </ span > < span class ="o "> =</ span > < span class ="n "> connect</ span > < span class ="o "> -</ span > < span class ="n "> awaitable</ span > < span class ="o "> -</ span > < span class ="n "> promise</ span > < span class ="p "> ;</ span >
289
289
290
290
< span class ="k "> explicit</ span > < span class ="n "> operation</ span > < span class ="o "> -</ span > < span class ="n "> state</ span > < span class ="o "> -</ span > < span class ="n "> task</ span > < span class ="p "> (</ span > < span class ="n "> < a href ="../../coroutine/coroutine_handle.html "> coroutine_handle<></ a > </ span > < span class ="n "> h</ span > < span class ="p "> )</ span > < span class ="k "> noexcept</ span > < span class ="o "> :</ span > < span class ="n "> coro</ span > < span class ="p "> (</ span > < span class ="n "> h</ span > < span class ="p "> )</ span > < span class ="p "> {}</ span >
291
291
< span class ="n "> operation</ span > < span class ="o "> -</ span > < span class ="n "> state</ span > < span class ="o "> -</ span > < span class ="n "> task</ span > < span class ="p "> (</ span > < span class ="n "> operation</ span > < span class ="o "> -</ span > < span class ="n "> state</ span > < span class ="o "> -</ span > < span class ="n "> task</ span > < span class ="o "> &&</ span > < span class ="p "> )</ span > < span class ="o "> =</ span > < span class ="k "> delete</ span > < span class ="p "> ;</ span >
@@ -308,7 +308,7 @@ <h3>Awaitable接続用へルパ</h3>
308
308
< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="n "> completion_signatures</ span > < span class ="o "> <</ span >
309
309
< span class ="n "> < i > SET-VALUE-SIG</ i > </ span > < span class ="p "> (</ span > < span class ="n "> V</ span > < span class ="p "> ),</ span >
310
310
< span class ="n "> < a href ="set_error.html "> set_error_t</ a > </ span > < span class ="p "> (</ span > < span class ="n "> < a href ="../../exception/exception_ptr.html "> exception_ptr</ a > </ span > < span class ="p "> ),</ span >
311
- < span class ="n "> set_stopped_t</ span > < span class ="p "> ()</ span > < span class ="o "> ></ span >
311
+ < span class ="n "> < a href =" set_stopped.html " > set_stopped_t</ a > </ span > < span class ="p "> ()</ span > < span class ="o "> ></ span >
312
312
</ code > </ pre > </ div >
313
313
</ p >
314
314
< p > 説明用のコールーチン< code > suspend-complete</ code > を下記の通り定義する。</ p >
@@ -331,15 +331,15 @@ <h3>Awaitable接続用へルパ</h3>
331
331
< span class ="n "> < a href ="../../exception/exception_ptr.html "> exception_ptr</ a > </ span > < span class ="n "> ep</ span > < span class ="p "> ;</ span >
332
332
< span class ="k "> try</ span > < span class ="p "> {</ span >
333
333
< span class ="k "> if</ span > < span class ="k "> constexpr</ span > < span class ="p "> (</ span > < span class ="n "> < a href ="../../concepts/same_as.html "> same_as</ a > </ span > < span class ="o "> <</ span > < span class ="n "> V</ span > < span class ="p "> ,</ span > < span class ="kt "> void</ span > < span class ="o "> ></ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
334
- < span class ="n "> co_await</ span > < span class ="n "> std </ span > < span class =" o " > :: </ span > < span class =" n " > move </ span > < span class ="p "> (</ span > < span class ="n "> sndr</ span > < span class ="p "> );</ span >
335
- < span class ="n "> co_await</ span > < span class ="n "> suspend</ span > < span class ="o "> -</ span > < span class ="n "> complete</ span > < span class ="p "> (</ span > < span class ="n "> set_value</ span > < span class ="p "> ,</ span > < span class ="n "> std </ span > < span class =" o " > :: </ span > < span class =" n " > move </ span > < span class ="p "> (</ span > < span class ="n "> rcvr</ span > < span class ="p "> ));</ span >
334
+ < span class ="n "> co_await</ span > < span class ="n "> < a href =" ../../utility/move.html " > std::move </ a > </ span > < span class ="p "> (</ span > < span class ="n "> sndr</ span > < span class ="p "> );</ span >
335
+ < span class ="n "> co_await</ span > < span class ="n "> suspend</ span > < span class ="o "> -</ span > < span class ="n "> complete</ span > < span class ="p "> (</ span > < span class ="n "> set_value</ span > < span class ="p "> ,</ span > < span class ="n "> < a href =" ../../utility/move.html " > std::move </ a > </ span > < span class ="p "> (</ span > < span class ="n "> rcvr</ span > < span class ="p "> ));</ span >
336
336
< span class ="p "> }</ span > < span class ="k "> else</ span > < span class ="p "> {</ span >
337
- < span class ="n "> co_await</ span > < span class ="n "> suspend</ span > < span class ="o "> -</ span > < span class ="n "> complete</ span > < span class ="p "> (</ span > < span class ="n "> set_value</ span > < span class ="p "> ,</ span > < span class ="n "> std </ span > < span class =" o " > :: </ span > < span class =" n " > move < /span > < span class ="p "> (</ span > < span class ="n "> rcvr</ span > < span class ="p "> ),</ span > < span class ="n "> co_await</ span > < span class ="n "> std </ span > < span class =" o " > :: </ span > < span class =" n " > move </ span > < span class ="p "> (</ span > < span class ="n "> sndr</ span > < span class ="p "> ));</ span >
337
+ < span class ="n "> co_await</ span > < span class ="n "> suspend</ span > < span class ="o "> -</ span > < span class ="n "> complete</ span > < span class ="p "> (</ span > < span class ="n "> set_value</ span > < span class ="p "> ,</ span > < span class ="n "> < a href =" ../../utility/move.html " > std::move </ a > < /span > < span class ="p "> (</ span > < span class ="n "> rcvr</ span > < span class ="p "> ),</ span > < span class ="n "> co_await</ span > < span class ="n "> < a href =" ../../utility/move.html " > std::move </ a > </ span > < span class ="p "> (</ span > < span class ="n "> sndr</ span > < span class ="p "> ));</ span >
338
338
< span class ="p "> }</ span >
339
339
< span class ="p "> }</ span > < span class ="k "> catch</ span > < span class ="p "> (...)</ span > < span class ="p "> {</ span >
340
340
< span class ="n "> ep</ span > < span class ="o "> =</ span > < span class ="n "> < a href ="../../exception/current_exception.html "> current_exception()</ a > </ span > < span class ="p "> ;</ span >
341
341
< span class ="p "> }</ span >
342
- < span class ="n "> co_await</ span > < span class ="n "> suspend</ span > < span class ="o "> -</ span > < span class ="n "> complete</ span > < span class ="p "> (</ span > < span class ="n "> set_error</ span > < span class ="p "> ,</ span > < span class ="n "> std </ span > < span class =" o " > :: </ span > < span class =" n " > move < /span > < span class ="p "> (</ span > < span class ="n "> rcvr</ span > < span class ="p "> ),</ span > < span class ="n "> std </ span > < span class =" o " > :: </ span > < span class =" n " > move </ span > < span class ="p "> (</ span > < span class ="n "> ep</ span > < span class ="p "> ));</ span >
342
+ < span class ="n "> co_await</ span > < span class ="n "> suspend</ span > < span class ="o "> -</ span > < span class ="n "> complete</ span > < span class ="p "> (</ span > < span class ="n "> set_error</ span > < span class ="p "> ,</ span > < span class ="n "> < a href =" ../../utility/move.html " > std::move </ a > < /span > < span class ="p "> (</ span > < span class ="n "> rcvr</ span > < span class ="p "> ),</ span > < span class ="n "> < a href =" ../../utility/move.html " > std::move </ a > </ span > < span class ="p "> (</ span > < span class ="n "> ep</ span > < span class ="p "> ));</ span >
343
343
< span class ="p "> }</ span >
344
344
< span class ="p "> }</ span >
345
345
</ code > </ pre > </ div >
0 commit comments