【发布时间】:2021-08-03 01:15:14
【问题描述】:
我一直在使用 c++20 协程,我偶然发现了 this 问题,即 lambda 捕获的生命周期不会在协程的整个生命周期内延长。
我想知道捕获什么是安全的,因为我不得不将所有捕获复制到新对象中,如下所示:
[a1=object]() -> task<void> {
// need to copy into a new object to safely reference for the lifetime of the coroutine
auto object = a1;
co_await something;
// ...
当我在我的程序中明确捕获this 时:
[this]() -> {
co_await something;
this->....
我可以在暂停后引用this,没有问题。
但是,在阅读标准时,我发现:
An entity is captured by reference if it is implicitly or explicitly captured but not captured by copy. It is
unspecified whether additional unnamed non-static data members are declared in the closure type for entities
captured by reference.
鉴于它是否将指针创建为属性是“未指定的”,这是否意味着我很幸运?或者this 捕获有什么不同?
【问题讨论】:
-
只要对象销毁后不使用lambda,对象销毁后的lambda不使用对象,都没有问题。其他任何事情要么是幸运的(程序立即崩溃),要么是不幸的(程序似乎可以工作)。
-
@Eljay 好吧,这与您所说的相反。使用 C++20 协程,协程的寿命比捕获的 lambda 变量长。所以这有点不同。检查我的第一个链接
-
如果协程在指向对象的生命周期结束后取消引用
this指针(例如调用对象的非静态成员函数),则协程具有未定义的行为。 -
但是在 lambda 生命周期结束之后呢?由于协程比 lambda 存在的时间更长。是否有可能尝试读取存储在 lambda 捕获中的
this指针地址并导致段错误?
标签: c++ lambda closures c++20 c++-coroutine