この質問は、このコメントから生じています:C ++ 20コルーチンのラムダ寿命の説明
この例について:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
したがって、問題は、によって返されたコルーチンを実行するfoo
とUBになるかどうかです。
(オブジェクトのライフタイムが終了した後の)メンバー関数の「呼び出し」はUBです。http://eel.is/c++draft/basic.life#6.2
...オブジェクトが配置される、または配置された保管場所のアドレスを表すポインターは、限られた方法でのみ使用できます。[...]次の場合、プログラムは未定義の動作をします。
[...]
-ポインタは非静的データメンバにアクセスしたりするために使用されるオブジェクトの非静的メンバ関数を呼び出し、または
ただし、この例では:
()
ラムダの有効期間中にラムダの演算子が呼び出されます- その後、中断され、
- 次にラムダが破壊され、
- その後、メンバー関数(演算子
()
)はある時点で再開されます。
この再開は未定義の動作と見なされますか?
this
ポインタが無効化されます。コメントでの議論も考慮してください。