lambda表达式的使用(3)

这次主要讲c++17以前和c++20中lambda表达式引用捕获的区别:

this 捕获当前类中的 this 指针,让 lambda 拥有和当前类成员函数同样的访问权限。

类的非静态成员变量(如 int value;)本身是"悬空"的,必须通过 this->value 才能访问到具体对象的那块内存。this 把当前对象的地址复制进闭包,所以 Lambda 函数体内部写 value 时,编译器会翻译成 this->value。访问权限:因为 Lambda 定义在成员函数内部,它拥有和该成员函数完全相同的访问级别。哪怕是 private 或 protected 成员,Lambda 内部也能随意读写

cpp 复制代码
class MyClass {
private:
    int secret = 10;
public:
    void test() {
        auto f = [this]() { 
            secret = 20;  // 编译器翻译为 this->secret = 20;
        };
    }
};

如果已经使用了 & 或者 =,就默认添加此选项(旧标准 C++17 及以前)。

当你写 =(按值捕获所有外部变量)或 \&(按引用捕获所有外部变量)时,编译器为了让你在 Lambda 里方便地访问成员变量,偷偷地把 this 也自动加进去了。

实际效果:你写的是 =,编译器实际处理时把它当作 =, this 来生成闭包。

cpp 复制代码
class MyClass {
    int value = 10;
public:
    void test() {
        // 以下两行在 C++17 及以前是等价的
        auto f1 = [=]() { return value; };   // 编译器偷偷加了 this
        auto f2 = [=, this]() { return value; }; // 显式写出
    }
};

捕获 this 的目的是可以在 lambda 中使用当前类的成员函数和成员变量。

如果没有 this,Lambda 函数体内写 value 或 getValue() 时会报错找不到标识符。因为 Lambda 是一个独立的局部函数对象,它不知道外面的 value 属于哪个对象。捕获 this 后,它就能通过 this 指针找到当前对象,从而调用成员函数和读写成员变量。

现代c++正确写法:

cpp 复制代码
class MyClass {
    int value = 10;
public:
    void test() {
        // ❌ C++20 会发出弃用警告
        // auto f1 = [=]() { return value; };

        // ✅ 显式捕获 this(推荐)
        auto f2 = [this]() { return value; };

        // ✅ 如果非要用 [=],必须显式加上 this
        auto f3 = [=, this]() { return value; };
    }
};

在旧标准(C++17前)下,为了让 Lambda 能像普通函数一样使用类的成员,编译器会在你写 = 时默认把 this 也带上。但现在(C++20)这条默认规则已弃用,必须自己明确写

简而言之:在c+++20里面如果要加等号但是不加this是不是就无法使用类中的成员,这样,如果lambda表达式中有关于类的操作,就会错误

相关推荐
Wang's Blog4 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
砚底藏山河5 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年5 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym5 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
DongQiShanRen5 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室5 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
quantdash_cc5 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
yu_zhidun6 小时前
企业电脑监控软件怎么选:别只看功能清单,先看这 6 个底层能力
开发语言·电脑·php·域智盾系统
把我格子衫拿来6 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化
无忧.芙桃6 小时前
C++语言原理与实践(十六):多态机制讲解
开发语言·c++·多态