【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;
});
}

浙公网安备 33010602011771号