我没有太看明白lambda表达式的作用,目前来看我只理解两点:
- 把对象的定义和使用放在一起,使代码易读。
- 捕获外部变量到对象内部,是一种保护变量的方式
可能我多看一些代码之后会明白lambda的作用吧
具体语法
lambda表达式组成:
lambda语句定义了一个匿名类的对象,这个类的作用域就是当前大括号。
捕获变量的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| ```[]```纯空,不捕获变量 ```[=]``` 拷贝外部变量。拷贝到函数体之后,如果对变量值进行修改,不改变原变量值。 ```[&]``` 引用外部变量。函数体里对变量值的修改也会改变原变量值,毕竟是把变量地址传到lambda里了。
```C++ class Test
{
public:
void capture_test()
{
// 无捕获,失败
// auto x1 = [](){return ex+1;};
// [=]捕获外部变量
auto x2 = [=](){return ex+2;};
// [&]捕获外部变量的引用
auto x3 = [&](){return ex+3;};
// [this]获得当前所在对象的指针,这里就是获得Test对象的指针
auto x4 = [this](){return ex+4;};
std::cout << "x2: " << x2() << std::endl;
std::cout << "x3: " << x3() << std::endl;
std::cout << "x4: " << x4() << std::endl;
}
int ex = 42;
};
|
改变lambda内变量
加上mutable即可
举例说明
1 2
| int x5 = 42; auto f = [x5]() mutable { return ++x5; };
|
mutable的作用是允许lambda在函数体内改变变量值,至于被捕获的变量值在lambda外是否被修改,取决于上面提到的[]捕获方式。