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; };