lambda表达式捕获成员变量
lambda可以捕获局部变量,但无法显式捕获类成员。如果在lambda中指定
auto func = [=](){};
以传值方式捕获所有变量,将捕获this,从而可访问类成员。例如下列伪代码,
class foo { public: void show() const { auto print = [=](){ std::cout << m_x << std::endl; };
print(); } private: int m_x; };
lambda表达式print隐式捕获了this,并访问类成员m_x。而在访问m_x时,其实表示的是表示this->m_x,也可以显式的说明this->m_x。lambda捕获的this是类的指针,lambda的this无法获取。
同样,以引用方式捕获所有变量时也将捕获this,从而可访问类成员。无论是传值捕获还是引用捕获,this的捕获方式永远是按值传递。
在lambda中若不想捕获this,又要访问单个类成员,现有方式暂不支持。如:
class foo { public: void show() const { auto print = [m_x](){ std::cout << m_x << std::endl; }; print(); } private: int m_x; int m_y; };
编译将报错,即无法单独捕获类成员,因为lambda只捕获对其可见的变量,包括全局变量、局部变量、类的this指针,类成员不在此列。
可以声明一个引用,对类成员起个别名,再捕获此引用变量:
class foo { public: void show() const {
auto& refx_x = m_x; auto print = [&refx_x](){ std::cout << refx_x << std::endl; }; print(); } private: int m_x; int m_y; };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律