【C++】lambda禁用隐式捕获

(1)禁用默认捕获=和&

  • GoogleC++规范规定:不要无脑使用[=][&]默认捕获,而最好显示捕获,即:明确捕获哪些变量,写明白变量名。

    不要为了少打几个字,影响代码安全性、清晰度。

    可以避免不清楚[=]不知道用了哪些外部变量,一旦改动外部变量的代码就可能影响到这个lambda的运行。

    无脑[&]更加危险,它会捕获所有局部变量的引用,一旦超过这些局部变量的作用域变量被释放,lambda里将满是悬垂引用。

    还有就是下面可能遇到的坑。

场景:

成员函数中使用lambda捕获成员变量,要求lambda调用时对象仍【存活】。而lambda中捕获的是this指针,是对象的地址而不是对象本身,再通过this->访问的成员。而一旦对象已经被其他异步操作销毁,而你再调用成员函数调用到lambda访问this指针,那个地址上对象已经销毁了。

如果对象一定会被异步销毁,而我又需要在成员函数中使用lambda捕获成员变量,怎么做呢?

(2)初始化捕获

在捕获列表中,将要访问的成员拷贝(快照)一份给新变量,从而和this解绑,也就不关心对象是否销毁。

class A
{
private:
    T data_;
public:
    run_async([data=data_]{
        std::cout<<data<<std::endl;
    });
}
posted @ 2026-02-02 16:47  仰望星河Leon  阅读(0)  评论(0)    收藏  举报