当前位置: 首页 > news >正文

lambda表达式的使用(3)

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

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

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

如果已经使用了 & 或者 =,就默认添加此选项(旧标准 C++17 及以前)。
当你写 [=](按值捕获所有外部变量)或 [&](按引用捕获所有外部变量)时,编译器为了让你在 Lambda 里方便地访问成员变量,偷偷地把 this 也自动加进去了。

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

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++正确写法:

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表达式中有关于类的操作,就会错误

http://www.jsqmd.com/news/1401199/

相关文章:

  • 合肥除甲醛公司甲醛治理公司剖析:金耀环境除甲醛 - CMA甲醛检测中心
  • 2026年厦门SEO/GEO服务实力盘点:正规服务商甄选指南与避坑技巧附优质公司推荐 - 行业观察网
  • 铁岭除甲醛公司甲醛治理公司剖析:金耀环境除甲醛 - CMA甲醛检测中心
  • 林伽一 · AI科技日报 | 2026年08月14日
  • 影之刃零发售日介绍 影之刃零什么时候发售
  • GitHub CodeQL 成本全解析:每月1000美元背后的隐藏费用与效能权衡
  • MySQL到金仓:自增主键与序列改造全流程——AUTO_INCREMENT兼容、并发写入与回退实战
  • 2026年常熟小规模企业代账推荐:开票频次、工资社保与资料交接指南 - 企业服务研究所
  • Simulink仿真单相方波逆变电路:从全桥拓扑到波形分析实战
  • memcpy 函数的底层原理详解(结合C++代码分析)
  • 汉中除甲醛公司甲醛治理公司剖析:金耀环境除甲醛 - CMA甲醛检测中心
  • 2026年AI推广SEO/GEO服务商选型指南:多家正规实力平台盘点+合作避坑攻略 - U渠道
  • 黄石除甲醛公司甲醛治理公司剖析:金耀环境除甲醛 - CMA甲醛检测中心
  • 数据采集卡从入门到精通(1):什么是数据采集卡——物理世界与数字世界之间的翻译官
  • 2026宁波工业装备外贸GEO优化公司盘点推荐7家:靠谱服务商甄选指南+合作避坑FAQ - 商业大观
  • GLM ZCode AI编程助手实战:从安装配置到项目开发全指南
  • 开关电源设计实战:从CCM/DCM模式到EMI整改全解析
  • 南通除甲醛公司甲醛治理公司剖析:金耀环境除甲醛 - CMA甲醛检测中心
  • HarmonyOS 7.0 端侧重建任务排队:3DGS 计算和 UI 交互怎么互不拖累
  • 基于Gemini API构建AI对话应用:从环境配置到生产部署的工程实践
  • 第二十五章 个体理解工程
  • 广安除甲醛公司甲醛治理公司剖析:金耀环境除甲醛 - CMA甲醛检测中心
  • 神仙打架!两个月大模型迭代封神,GLM5.3实测全方位升级
  • 邯郸除甲醛公司甲醛治理公司剖析:金耀环境除甲醛 - CMA甲醛检测中心
  • Vue面试核心原理深度解析:从响应式到性能优化实战指南
  • 义乌除甲醛公司甲醛治理公司剖析:金耀环境除甲醛 - CMA甲醛检测中心
  • 服务器CPU常用测试工具(Linux)
  • 第二十四章 个体认知形成工程
  • 老旧Mac免费升级最新macOS:OpenCore Legacy Patcher开源工具完整指南
  • MySQL Workbench新手入门:从零掌握数据库创建与CRUD操作