在协程lambda(C++)中捕获“this”安全吗

fdbelqdn  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(157)

我一直在使用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,没有任何问题。
然而,在阅读标准时,我发现:
如果实体被隐式或显式捕获但未被复制捕获,则通过引用捕获。未指定是否在通过引用捕获的实体的闭包类型中声明额外的未命名非静态数据成员。
假设它是否将指针创建为一个属性是“未指定的”,这是否意味着我只是运气好?或者this捕获有什么不同?

von4xj4u

von4xj4u1#

程序员应该忽略标准中的那句话:它仅仅允许实现分配比可能天真地期望的具有引用捕获的lambda对象更少的内存(特别是当调用操作符内联时)。

相关问题