C++11引入了lambda表达式,它提供了一种实现匿名函数的简洁方式。但是lambda表达式默认是不会捕获外部this指针。因此,想要在lambda函数内部访问外部类的成员,需要显式捕获this指针。

默认不捕获this指针

lambda表达式定义时默认情况下默认不会捕获外部作用域的任何变量。这就包括不会捕获定义lambda的类的this指针,即lambda函数体内无法直接访问外部类成员函数。举个例子

class Foo {
  public:
   int x =  1;
   void func() {
     auto lambda = [](){x = 2;};
   }
};

捕获外部this指针

上述例子就是错误的,x没有办法被lambda访问。有什么办法吗,这里可以使用[this]可以捕获外部类的this指针到lambda内,然后使用this指针访问外部类的成员。上述例子就可以改为使用[this]指针来访问x。具体代码如下所示

class Foo {
  public:
   int x =  1;
   void func() {
     auto lambda = [this](){x = 2;};
   }
};

再举个例子

class Outer {
public:
  int x = 10;
  void test() {
   auto lambda = [this]() {
   	    return this->x;		
   }
       std::cout << lambda() << std::endl;
    }
  };

int main() {
   Outer outer;
   outer.test();
}

这样lambda使用[this]指针来捕获外部类Outer的实例,然后在lambda函数体类,可以用过this->x来访问外部变量x。

总结

C++11对lambda表达式的扩展允许简单地定义匿名函数,但是需要注意默认的捕获语义。使用[this]可以轻松访问外部类成员,对封装复用功能非常有用。

10-27 18:03