Це питання випливає з цього коментаря: пояснення життя Ламбди для C ++ 20 спільних процедур
щодо цього прикладу:
auto foo() -> folly::coro::Task<int> {
auto task = []() -> folly::coro::Task<int> {
co_return 1;
}();
return task;
}
Таким чином, питання полягає в тому, чи foo
не призведе до виконання повернутої кореневищем UB.
"Виклик" функції члена (після закінчення життя об'єкта) є UB: http://eel.is/c++draft/basic.life#6.2
... будь-який вказівник, який представляє адресу місця зберігання, де об'єкт буде знаходитися або знаходився, може використовуватися, але лише обмежено. [...] У програмі не визначена поведінка, якщо:
[...]
- покажчик використовується для доступу до нестатичного члена даних або виклику функції нестатичного члена об'єкта , або
Однак у цьому прикладі:
()
оператор лямбда називається в той час як термін служби лямбда залишається в силі- Потім його призупиняють,
- тоді лямбда знищується,
- а потім функція-член (оператор
()
) відновлюється в якийсь момент після цього.
Чи вважається це відновлення невизначеною поведінкою?
this
покажчик недійсний. Розгляньте також обговорення в коментарях.