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?
quelle
this
Zeiger ungültig wird. Beachten Sie auch die Diskussion in den Kommentaren.Antworten:
[dcl.fct.def.coroutine] p3 :
Der implizite Objektparameter ist in Ihrem Beispiel eine konstante Referenz, und daher baumelt diese Referenz, wenn die Ausführung fortgesetzt wird, nachdem das Abschlussobjekt zerstört wurde.
In Anbetracht der Tatsache, dass Objekte während der Ausführung einer Elementfunktion zerstört werden, ist dies in der Tat per se in Ordnung, und kein anderer als der Standard selbst impliziert dies in [basic]. :
(NB: Die obige UB ist weil die implizite
this
, dass das implizite Objekt nicht gewaschen wird und sich immer noch auf den impliziten Objektparameter bezieht.)Ihr Beispiel scheint also klar definiert zu sein, vorausgesetzt, dass die Wiederaufnahme der Ausführung nicht denselben Regeln unterliegt wie ein ursprünglicher Aufruf. Beachten Sie, dass der Verweis auf das Schließobjekt möglicherweise baumelt, aber zwischen Suspendierung und Wiederaufnahme in keiner Weise darauf zugegriffen wird.
quelle