Diese Frage ergibt sich aus diesem Kommentar: Erklärung der Lambda-Lebensdauer für C ++ 20-Coroutinen
zu diesem Beispiel:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
Die Frage ist also, ob die Ausführung der von zurückgegebenen Coroutine zu foo
UB führen würde.
Das "Aufrufen" einer Mitgliedsfunktion (nach Ablauf der Lebensdauer des Objekts) lautet UB: http://eel.is/c++draft/basic.life#6.2
... jeder Zeiger, der die Adresse des Speicherorts darstellt, an dem sich das Objekt befindet oder befand, darf nur in begrenztem Umfang verwendet werden. [...] Das Programm hat ein undefiniertes Verhalten, wenn:
[...]
- Der Zeiger wird verwendet, um auf ein nicht statisches Datenelement zuzugreifen oder eine nicht statische Elementfunktion des Objekts aufzurufen , oder
In diesem Beispiel jedoch:
- Der
()
Operator des Lambda wird aufgerufen, solange die Lebensdauer des Lambda noch gültig ist - Es wird dann ausgesetzt,
- dann wird das Lambda zerstört,
- und dann wird die Elementfunktion (Operator
()
) irgendwann danach wieder aufgenommen.
Wird diese Wiederaufnahme als undefiniertes Verhalten betrachtet?
this
Zeiger ungültig wird. Beachten Sie auch die Diskussion in den Kommentaren.