Lambda表达式的基本构成:
[captures](params) -> return_type { body };
Lambda 主要分为五个部分,对应为:
[捕获列表] (函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
捕获列表,用来说明外部变量的访问方式,外部变量访问方式说明符可以是 = 或 & ,表示函数体中用到的、定义在外面的变量在函数体中是否允许被改变。= 表示值传递,不允许改变。& 表示引用传递,允许改变。
包括下面几种形式:
- [ ] 表示不捕获任何变量
- [=] 表示按值传递的方法捕获父作用域的所有变量
- [&] 表示按引用传递的方法捕获父作用域的所有变量
- [=, &a] 表示按值传递的方法捕获父作用域的所有变量,但按引用传递的方法捕获变量a
- [&, a] 表示按引用传递的方法捕获父作用域的所有变量,但按值传递的方法捕获变量a
Tips:
在低版本中需要再.pro文件中追加:CONFIG += c++11
//lambda表达式 [](){};
QPushButton *btn2 = new QPushButton;
btn2->move(100,0);
btn2->setParent(this);
btn2->setText("aaa");
//函数体内可以使用Lambda所在作用范围内所有可见的局部变量
[=](){
btn2->setText("bbb");
}();
//mutable
QPushButton * myBtn1 = new QPushButton(this);
QPushButton * myBtn2 = new QPushButton(this);
myBtn1->move(0,100);
myBtn2->move(100,100);
int m=10;
//加上mutable修饰符后,可以修改按值传递进来的拷贝
connect(myBtn1,&QPushButton::clicked,this,[m]()mutable{m=20;qDebug()<<m;});
connect(myBtn2,&QPushButton::clicked,this,[=](){qDebug()<<m;});
qDebug()<<m;
//->返回值类型
int num = []()->int{return 100;}();
qDebug()<<"num="<<num;
//[](){}推荐使用
QPushButton * btn3 = new QPushButton;
btn3->setParent(this);
btn3->move(200,200);
btn3->setText("aaa");
//槽函数是lambda表达式,则接受者this可以省略
connect(btn3,&QPushButton::clicked,[=](){
btn3->setText("ccc");
this->st->treat("鱼香肉丝"); //解决clicked不能连接有参槽函数的问题
this->close();
});