Pertanyaan ini berasal dari komentar ini: Penjelasan seumur hidup Lambda untuk C ++ 20 coroutine
tentang contoh ini:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
Jadi pertanyaannya adalah apakah mengeksekusi coroutine yang dikembalikan oleh foo
akan menghasilkan UB.
"Memanggil" fungsi anggota (setelah masa hidup objek berakhir) adalah UB: http://eel.is/c++draft/basic.life#6.2
... pointer apa pun yang mewakili alamat lokasi penyimpanan di mana objek akan atau terletak dapat digunakan tetapi hanya dengan cara yang terbatas. [...] Program memiliki perilaku yang tidak terdefinisi jika:
[...]
- pointer digunakan untuk mengakses anggota data non-statis atau memanggil fungsi anggota non-statis objek , atau
Namun, dalam contoh ini:
- itu
()
operator lambda disebut sementara seumur hidup lambda masih berlaku - Kemudian ditangguhkan,
- maka lambda dihancurkan,
- dan kemudian fungsi anggota (operator
()
) dilanjutkan di beberapa titik sesudahnya.
Apakah pembukaan kembali ini dianggap sebagai perilaku yang tidak terdefinisi?
this
pointer tidak valid. Pertimbangkan juga diskusi dalam komentar.