lambda表达式捕获this
时间: 2023-07-06 14:18:55 浏览: 166
当使用 lambda 表达式时,如果要在其中访问当前对象的成员变量或成员函数,需要捕获 this 指针。在 C++11 中,可以使用以下两种方式捕获 this:
1. 通过值捕获:[=],这种方式会将当前对象的所有成员变量复制一份到 lambda 表达式中,但是无法修改这些成员变量。
2. 通过引用捕获:[&],这种方式会将当前对象的引用传递给 lambda 表达式,可以修改当前对象的成员变量。
需要注意的是,当 lambda 表达式被执行时,当前对象必须还存在,否则访问成员变量或成员函数会出错。
相关问题
c++的lambda表达式捕获this_现代 C++:Lambda 表达式
Lambda表达式是C++11引入的一种函数对象,可以在需要函数对象的地方使用,比如作为函数参数、返回值等。Lambda表达式的语法形式如下:
```
[capture list](parameters) mutable exception -> return type {
// function body
}
```
其中,`capture list` 表示捕获列表,用于捕获外部变量。`parameters` 表示函数参数列表,`mutable` 用于表示是否可以修改值传递的变量,`exception` 是异常列表,`return type` 表示返回类型,`function body` 则是函数体。
在Lambda表达式中,可以通过 `[this]` 捕获当前对象的指针,即 `this` 指针,可以方便地访问当前对象的成员变量和成员函数。例如:
```
class MyClass {
public:
void foo() {
int x = 1;
auto lambda = [this, x]() mutable {
this->m_member_var += x;
this->m_member_function();
x++;
};
lambda();
}
private:
int m_member_var;
void m_member_function();
};
```
在上面的例子中,Lambda表达式通过 `[this, x]` 捕获了当前对象的指针和 `foo()` 函数中定义的变量 `x`。在 Lambda 表达式中可以通过 `this->m_member_var` 和 `this->m_member_function()` 访问当前对象的成员变量和成员函数。由于 `x` 是值传递的,所以在 Lambda 表达式中需要使用 `mutable` 关键字使其可修改,可以通过 `x++` 修改变量的值。最后调用 `lambda()` 执行 Lambda 表达式。
需要注意的是,Lambda表达式捕获 `this` 指针时,需要保证当前对象是有效的,即不能在已经销毁的对象中访问成员变量和成员函数。
lambda表达式捕获this 声明方式
lambda表达式捕获this指针的声明方式主要有两种:隐式捕获和显式捕获。
1. 隐式捕获
隐式捕获使用默认的捕获方式,即在lambda表达式中使用this指针来捕获外部的this指针。在lambda表达式中使用this指针时,需要使用捕获列表中的关键字"=",例如:
```
class MyClass {
public:
void foo() {
auto lambda = [=](){
// 在lambda表达式中访问类的成员变量和成员函数
// ...
};
lambda();
}
};
```
在上面的例子中,lambda表达式使用默认捕获方式捕获外部的this指针。
2. 显式捕获
显式捕获需要在lambda表达式的参数列表中显式地指定this指针的捕获方式。显式捕获可以使用三种方式:值捕获、引用捕获和指针捕获,分别使用关键字"="、"&"、"this"来指定。例如:
```
class MyClass {
public:
void foo() {
auto lambda = [this](){
// 在lambda表达式中访问类的成员变量和成员函数
// ...
};
lambda();
}
};
```
在上面的例子中,lambda表达式使用指针捕获方式显式捕获外部的this指针。
阅读全文