Bu soru şu yorumdan kaynaklanıyor: C ++ 20 programları için Lambda ömür boyu açıklama
bu örnekle ilgili olarak:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
Yani soru, geri dönen koroutinin yürütülmesinin foo
UB ile sonuçlanıp sonuçlanmayacağıdır.
Bir üye işlevini "çağırma" (nesnenin ömrü bittikten sonra) UB: http://eel.is/c++draft/basic.life#6.2
... nesnenin bulunduğu veya bulunduğu depolama konumunun adresini temsil eden herhangi bir işaretçi kullanılabilir, ancak yalnızca sınırlı yollarla. [...] Program şu durumlarda tanımsız bir davranışa sahiptir:
[...]
- işaretçi, statik olmayan bir veri üyesine erişmek veya nesnenin statik olmayan bir üye işlevini çağırmak için kullanılır veya
Ancak, bu örnekte:
()
lambda ömrü hala geçerli iken lambda operatörü denir- Daha sonra askıya alınır,
- sonra lambda yok edilir,
- ve sonra üye fonksiyonu (operatör
()
) daha sonra bir noktada devam eder.
Bu yeniden başlama tanımsız davranış olarak kabul edilir mi?
this
işaretçinin yürütülmesi geçersiz kılınan bir üye işlevi ile ilgili . Yorumlardaki tartışmayı da düşünün.