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 foo
UB.
"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?
this
se invalida la ejecución del puntero. Considere también la discusión en los comentarios.