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 fooentraî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?
thispointeur est invalidée. Considérez également la discussion dans les commentaires.