0

0

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

下次还敢

下次还敢

发布时间:2025-10-16 10:47:02

|

192人浏览过

|

来源于php中文网

原创

捕获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论文助手

下载
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更灵活地操作对象成员,但务必注意对象生命周期的匹配。不复杂但容易忽略。

相关专题

更多
lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

50

2026.01.05

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

404

2023.08.14

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

9

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

18

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

19

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.4万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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