Esta pregunta surge de este comentario: explicación de por vida de Lambda para las corutinas de C ++ 20
con respecto a este ejemplo:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
Entonces, la pregunta es si ejecutar la corutina devuelta por fooUB.
"Llamar" a una función miembro (una vez finalizada la vida útil del objeto) es UB: http://eel.is/c++draft/basic.life#6.2
... se puede usar cualquier puntero que represente la dirección de la ubicación de almacenamiento donde se ubicará o se ubicará el objeto, pero solo de manera limitada. [...] El programa tiene un comportamiento indefinido si:
[...]
- el puntero se usa para acceder a un miembro de datos no estático o llamar a una función de miembro no estático del objeto , o
Sin embargo, en este ejemplo:
()se llama al operador de la lambda mientras la vida útil de la lambda sigue siendo válida- Luego se suspende,
- entonces la lambda es destruida
- y luego la función miembro (operador
()) se reanuda en algún momento posterior.
¿Esta reanudación se considera un comportamiento indefinido?
thisse invalida la ejecución del puntero. Considere también la discusión en los comentarios.