匿名函数
最后更新于:2022-04-02 02:09:21
[TOC]
## 概述
匿名函数,又称为lambda表达式,c++ 是支持匿名函数的但是需要赋值给 auto 类型
格式
```
[capture](parameters){body}
```
简单示例
```
[](int x, int y) { return x + y; } // 隐式返回类型
[](int& x) { ++x; } // 没有return语句 -> lambda 函数的返回类型是'void'
[]() { ++global_x; } // 没有参数,仅访问某个全局变量
[]{ ++global_x; } // 与上一个相同,省略了()
```
### Lambda函数中的变量截取
```
[] //不截取任何变量,试图在Lambda内使用任何外部变量都是错误的(全局变量除外).
[&] //截取外部作用域中所有变量,并作为引用在函数体中使用
[=] //截取外部作用域中所有变量,并拷贝一份在函数体中使用,lambda修改后的值不会影响到外部
[=, &foo] //截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
[bar] //截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
[this] //截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
-----------------------------
[x, &y] //x 按值捕获, y 按引用捕获.
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获
```
## 示例
### 匿名函数在connect中的使用
```
int n = 0;
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout,this, [=]()mutable {n += 1;qDebug()<start(1000);
```
> connect 中需要使用 "[=]"
';