这个问题源于此评论:C++ 20 coroutines 的 Lambda 生命周期解释
关于这个例子:
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
...可以使用任何表示对象将要或曾经位于的存储位置的地址的指针,但只能以有限的方式使用。[...]如果出现以下情况,该程序具有未定义的行为:
[...]
-- 指针用于访问非静态数据成员或调用对象的非静态成员函数,或
但是,在此示例中:
()在 lambda 的生命周期仍然有效时调用 lambda的运算符- 然后暂停,
- 然后 lambda 被销毁,
- 然后成员函数(运算符
())在之后的某个时间点恢复。
这种恢复是否被认为是未定义的行为?