这个问题源于以下评论:C ++ 20协程的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被破坏,
- 然后成员函数(operator
()
)随后恢复。
是否将此恢复视为未定义的行为?
this
指针无效。还考虑评论中的讨论。