C++20 コア言語機能読書会vol.8
開催日時
2022年6月8日(水) 21:00~22:30
開催URL
参加人数
4人
ウォーミングアップ
p.38 co_await式ではawaitable型のメンバ関数~
await_readyの戻り値でコルーチンを中断するかを制御
falseで中断
中断する時はawait_suspend()が呼び出される
(promise.initial_suspend()の戻り値の)awaitableのメンバ関数await_ready()がtrueを返す(=中断しない)、または中断したコルーチンが再開されたとき
initial_await_resume_called変数にtrueを代入
waitableのメンバ関数await_resume()を実行
前回中断した次の処理からコルーチン本体の実行再開
p.39 コルーチン本体が例外を投げた時~
initial_await_resume_called == falseのとき
例外は外に素通し
初期化が完了していない時の例外
この時は呼び出し側の責任
initial_await_resume_called == trueのとき
promise.unhandled_exception()に委ねられる
これもカスタマイズ可能
p.39 コルーチン本体の実行がつつがなく完了した場合~
終了時の話
promise.final_suspend()の戻り値(これもawaitable型)で終了時のふるまいも制御できる
中断されない場合
コルーチン実行は終了
各種オブジェクト破棄
中断する場合
呼び出し側にコルーチンハンドルは渡っているのでそのハンドルが解放されるまで中断しておくことができる
そのあとの処理は一緒
文字多い
書くの大変だっただろうな…
p.39 コルーチン本体内(function body)にあるco_await式でも~
さらにカスタマイゼーションポイントが出てきた…
ユーザがco_awaitに非awaitable型のものを渡したとしても、promise.await_transform()が用意されていればこの関数を通してawaitable型に変換するコードを書くことができる
これでユーザはawaitable型を気にしなくてもコルーチンを利用可能になる
ほぼ規格書をわかりやすく、日本語にした感じ
それだけでありがたい…
p.39 コルーチン本体内のco_yield式はその引数をeとすると~
次回ここから
お悩み雑談室
C++習い始めのとっかかり
やっぱりcpprefjpかな
いなむのみたまさんの考える三大C++20機能