Questa domanda nasce da questo commento: spiegazione a vita Lambda per coroutine C ++ 20
riguardo a questo esempio:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
Quindi la domanda è se l'esecuzione della coroutine restituita foo
comporterebbe UB.
"Chiamare" una funzione membro (al termine della durata dell'oggetto) è UB: http://eel.is/c++draft/basic.life#6.2
... qualsiasi puntatore che rappresenta l'indirizzo della posizione di archiviazione in cui si troverà o si trovava l'oggetto può essere utilizzato, ma solo in modo limitato. [...] Il programma ha un comportamento indefinito se:
[...]
- il puntatore viene utilizzato per accedere a un membro di dati non statico o per chiamare una funzione di membro non statico dell'oggetto , oppure
Tuttavia, in questo esempio:
()
viene chiamato l' operatore del lambda mentre la durata del lambda è ancora valida- Viene quindi sospeso,
- allora la lambda viene distrutta,
- e quindi la funzione membro (operatore
()
) viene ripresa in seguito.
Questa ripresa è considerata un comportamento indefinito?
this
puntatore viene invalidata. Considera anche la discussione nei commenti.