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; };
复制代码

 

posted @   亚九  阅读(5794)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示