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]
可以轻松访问外部类成员,对封装复用功能非常有用。