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?
fuente
this
se invalida la ejecución del puntero. Considere también la discusión en los comentarios.Respuestas:
[dcl.fct.def.coroutine] p3 :
El parámetro objeto implícito es en su ejemplo una referencia constante, y por lo tanto esa referencia estará colgando cuando se reanude la ejecución después de que el objeto de cierre haya sido destruido.
Sin embargo, en la nota de los objetos que se destruyen durante la ejecución de una función miembro, esto de hecho está bien per se, y nada más que el estándar en sí implica esto en [básico] :
(NB: el UB anterior se debe a que lo implícito
this
no se lava y aún se refiere al parámetro del objeto implícito).Por lo tanto, su ejemplo parece estar bien definido, condicional a la idea de que la reanudación de la ejecución no se ajusta a las mismas reglas que una invocación original. Tenga en cuenta que la referencia al objeto de cierre puede estar colgando, pero no se accede de ninguna manera entre la suspensión y la reanudación.
fuente