捕获this指针可让lambda访问类成员,[this]按值捕获指针并具有引用语义,[=]和[&]隐式包含this,需注意对象生命周期避免悬空指针。

在C++中,lambda表达式可以捕获当前对象的 this 指针,从而访问类的成员变量和成员函数。这在类的成员函数中定义lambda时非常常见,尤其适用于回调、异步操作或STL算法中需要访问对象内部状态的场景。
捕获this的基本语法
在lambda的捕获列表中使用 this,即可将当前对象的指针捕获。捕获后,lambda内部可以直接访问类的非静态成员。
class MyClass { int value = 42;public: void func() { auto lambda = [this]() { std::cout << value << std::endl; // 可直接访问成员变量 }; lambda(); }};
在这个例子中,[this] 显式捕获了当前对象的指针,lambda因此能访问 value 成员。
值捕获与引用捕获的区别
this 捕获的是指向当前对象的指针,本质上是按值捕获指针本身,但通过该指针可以修改对象的成员,所以具有“引用语义”。
立即学习“C++免费学习笔记(深入)”;
[this]:捕获this指针,可读写成员变量(若权限允许) [=]:隐式按值捕获所有自动变量,包括this(等价于包含this) [&]:隐式按引用捕获所有自动变量,也包含this
注意:[=] 和 [&] 都会自动包含对 this 的捕获,不需要重复写 [this]。
应用场景举例
class DataProcessor { std::vector data{1, 2, 3, 4, 5}; int offset = 10;public: void process() { std::for_each(data.begin(), data.end(), [this](int x) { std::cout << (x + offset) << " "; }); std::cout << std::endl; }};
这里lambda通过 [this] 访问了 offset 成员,实现自定义处理逻辑。
生命周期注意事项
lambda捕获了 this 指针后,如果该lambda被保存并在对象销毁后调用,会导致悬空指针和未定义行为。
例如:
std::function dangerousLambda;class BadExample { int val = 100;public: void makeLambda() { dangerousLambda = [this]() { std::cout << val; }; }};// 若对象销毁后调用 dangerousLambda,则崩溃
解决方法:考虑使用 shared_from_this(继承 std::enable_shared_from_this)来管理生命周期,或改用值捕获关键数据。
基本上就这些。正确使用 [this] 捕获能让lambda更灵活地操作对象成员,但务必注意对象生命周期的匹配。不复杂但容易忽略。
以上就是c++++中lambda表达式如何捕获this指针_c++ lambda捕获this的语法与应用的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1479291.html
微信扫一扫
支付宝扫一扫