200200
201201 < p class ="text-right "> < small >
202202 最終更新日時(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秒
205205 </ span >
206206 < br />
207207 < span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
@@ -235,8 +235,8 @@ <h2>概要</h2>
235235< 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 >
236236< p > < a class ="cpprefjp-defined-word " data-desc ="プログラム定義型に対するオーバーロードが許されている標準関数名について、中でいい感じにオーバーロード解決して呼び出してくれる関数オブジェクト "> カスタマイゼーションポイントオブジェクト</ a > の呼び出し式< code > connect(sndr, rcvr)</ code > は、下記の動作となる。</ p >
237237< 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 >
240240< li > そうでなければ、< code > new_sndr</ code > を< a href ="../../../lang/cpp20/coroutines.html "> コルーチンのAwaitable型</ a > とみなして< code > rcvr</ code > と接続した結果を返す。</ li >
241241</ ul >
242242< h2 > 効果</ h2 >
@@ -254,16 +254,16 @@ <h3>Awaitable接続用へルパ</h3>
254254< p > 説明用のクラス< code > connect-awaitable-promise</ code > , < code > operation-state-task</ code > をそれぞれ下記の通り定義する。</ p >
255255< 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 >
256256< 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 >
258258 < 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 >
259259
260260 < 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 >
264264
265265 < 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 >
267267 < span class ="k "> return</ span > < span class ="n "> < a href ="../../coroutine/noop_coroutine.html "> noop_coroutine()</ a > </ span > < span class ="p "> ;</ span >
268268 < span class ="p "> }</ span >
269269
@@ -285,7 +285,7 @@ <h3>Awaitable接続用へルパ</h3>
285285< 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 >
286286 < 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 >
287287 < 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 >
289289
290290 < 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 >
291291 < 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>
308308< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="n "> completion_signatures</ span > < span class ="o "> <</ span >
309309 < span class ="n "> < i > SET-VALUE-SIG</ i > </ span > < span class ="p "> (</ span > < span class ="n "> V</ span > < span class ="p "> ),</ span >
310310 < 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 >
312312</ code > </ pre > </ div >
313313</ p >
314314< p > 説明用のコールーチン< code > suspend-complete</ code > を下記の通り定義する。</ p >
@@ -331,15 +331,15 @@ <h3>Awaitable接続用へルパ</h3>
331331 < span class ="n "> < a href ="../../exception/exception_ptr.html "> exception_ptr</ a > </ span > < span class ="n "> ep</ span > < span class ="p "> ;</ span >
332332 < span class ="k "> try</ span > < span class ="p "> {</ span >
333333 < 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 >
336336 < 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 >
338338 < span class ="p "> }</ span >
339339 < span class ="p "> }</ span > < span class ="k "> catch</ span > < span class ="p "> (...)</ span > < span class ="p "> {</ span >
340340 < 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 >
341341 < 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 >
343343 < span class ="p "> }</ span >
344344< span class ="p "> }</ span >
345345</ code > </ pre > </ div >
0 commit comments