首页 > 后端开发 > C++ > 正文

c++中lambda表达式如何捕获this指针_c++ lambda捕获this的语法与应用

下次还敢
发布: 2025-10-16 10:47:02
原创
178人浏览过
捕获this指针可让lambda访问类成员,[this]按值捕获指针并具有引用语义,[=]和[&]隐式包含this,需注意对象生命周期避免悬空指针。

c++中lambda表达式如何捕获this指针_c++ lambda捕获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]。

应用场景举例

常见于需要将成员函数逻辑传递给标准库算法或异步任务的情况。

千图设计室AI海报
千图设计室AI海报

千图网旗下的智能海报在线设计平台

千图设计室AI海报 172
查看详情 千图设计室AI海报
class DataProcessor {
    std::vector<int> 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<void()> 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的语法与应用的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号