To pytanie wynika z tego komentarza: Lambda dożywotniego wyjaśnienia dla korupcji w C ++ 20
w odniesieniu do tego przykładu:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
Pytanie brzmi więc, czy wykonanie zwróconej przez niego coroutine foo
spowoduje UB.
„Wywołanie” funkcji członka (po zakończeniu życia obiektu) to UB: http://eel.is/c++draft/basic.life#6.2
... każdy wskaźnik reprezentujący adres miejsca przechowywania, w którym obiekt będzie lub był zlokalizowany, może być używany, ale tylko w ograniczonym zakresie. [...] Program ma niezdefiniowane zachowanie, jeśli:
[...]
- wskaźnik jest używany do uzyskania dostępu do elementu danych niestatycznych lub wywołania funkcji elementu niestatycznego obiektu , lub
Jednak w tym przykładzie:
()
operator lambda nazywa się natomiast żywotność lambda jest nadal ważny- Następnie jest zawieszony,
- wtedy lambda zostaje zniszczona,
- a następnie funkcja członka (operator
()
) zostanie wznowiona w pewnym momencie później.
Czy to wznowienie jest uważane za niezdefiniowane zachowanie?
this
wskaźnik jest unieważniany. Rozważ także dyskusję w komentarzach.