Cette question découle de ce commentaire: explication de la durée de vie Lambda pour les coroutines C ++ 20
concernant cet exemple:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
La question est donc de savoir si l'exécution de la coroutine renvoyée par foo
entraînerait UB.
"Appeler" une fonction membre (après la fin de la durée de vie de l'objet) est UB: http://eel.is/c++draft/basic.life#6.2
... tout pointeur qui représente l'adresse de l'emplacement de stockage où l'objet sera ou était situé peut être utilisé, mais uniquement de manière limitée. [...] Le programme a un comportement indéfini si:
[...]
- le pointeur est utilisé pour accéder à un membre de données non statique ou appeler une fonction membre non statique de l'objet , ou
Cependant, dans cet exemple:
- l'
()
opérateur du lambda est appelé alors que la durée de vie du lambda est toujours valide - Il est alors suspendu,
- alors la lambda est détruite,
- puis la fonction membre (opérateur
()
) est reprise à un moment donné par la suite.
Cette reprise est-elle considérée comme un comportement indéfini?
this
pointeur est invalidée. Considérez également la discussion dans les commentaires.