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 @ 2021-12-16 11:44  亚九  阅读(5143)  评论(0编辑  收藏  举报