对于全局变量,没有捕获的概念。
因为全局变量在任意位置都可以使用。
因为捕获,是可以捕获函数中的任意量
- [ ] 不捕获任何变量
- [&]捕获外部作用域中所有变量。并作为引用在函数体中使用(按引用捕获)
int g_max;//不能捕获
int fun(int x)
{
int sum = 10;
int num = 20;
g_max = sum + num;
//auto f1 = [](int a)->int {return a + g_max};
auto f1 = [&](int a)->int {
x = a; //对 x,sum,num可 w 可 r
sum += 10;
num = a + x;
return a + num;
};
}
lambda定义在哪个函数内,就会捕获哪个函数内的局部变量。
因此不能定义在主函数中。原因如下:main中没有x,sum,num,无法捕获。
- [=]
捕获外部作用域中所有变量。并作为副本在函数体中使用(按值捕获)
int& Value() { return value; }
const int&Value() const{ return value; }
};
int fun()
{
Object objx(10);
//引用捕获
auto f1 = [&]()->void
{
objx.Value() = 100;
};
//值捕获
auto f2 = [=]()->int
{
int a = objx.Value(); //调用了拷贝构造创建了objx
//而不是使用上面的objx
return a;
};
f1();
int x = f2();
return x;
}
很明显:产生了副本。
lambda就是去替换仿函数
- [-,&foo]
Object objx(10);
int a = 10;
int b = 20;
auto f4 = [=, &a, &b]()->int {};
- [bar] 按值捕获
Object objx(10);
int a = 10;
int b = 20;
auto f4 = [a]()->int {};
- [this] 就是捕获类中的成员函数的this的地址。