Lambda表达式
C++11 中Lambda表达式用于定义和创建匿名函数
语法:[] () {};
[函数参数] (形参列表) mutable -> 返回值类型 {函数体};
- []标识符,告诉编译器此处是匿名函数,也用于捕获表达式以外的变量。即中括号内的变量是来自于lambda函数作用域之外
- 中括号内为空,不使用外部变量
- [=],外部变量以值传递的方式传给函数内部
- [&],外部变量以引用传递的方式传给函数内部
- ()参数,lambda表达式函数体的形参就放在这里。
- {} 函数实现体
- 修饰或声明,可省略
- mutable,加mutable修饰符后可以修改传递进来的拷贝
- exception 声明用于指定函数抛出的异常
- -> 数据类型,函数返回的数据类型,无返回值可省略
- {} 函数体
- 花括号后再跟(),表示直接调用该匿名函数
connect(btn,&QPushButton::clicked,[=](){
btn->setText("aaaaa");
emit hdh->class_over();
this->close();
});
简单使用
无返回值:
#include<iostream>
#include<string>
using namespace std;
int main() {
// 定义一个lambda表达式并立即调用
[](int x){
cout << x << endl;
}(9);
// 将一个lambda表达式赋值给auto对象,以便于重复调用
auto printX = [](string str){
cout << str << endl;
}
// 通过对象调用函数
printX(90);
system("pause");
return 0;
}
有返回值,加箭头、关键字:
int main() {
// 直接定义表达式并调用
int ret = [](int a, int b) ->int {
int c = a + b;
return c;
}(2,3);
cout << ret << endl;
// 使用auto对象接收再调用
auto myAdd = [](int a, int b){
int c = a + b;
return c;
};
cout << myAdd(2,3) << endl;
}
捕获表达式外部参数并在函数内部修改值:
int main() {
int a = 10, b = 15;
/*
lambda表达式中括号内传递=表示捕获表达式外所有变量,并以值传递的方式传给函数体
同时,函数体内不能修改传递进来的值的拷贝,因为默认情况下函数参数是有const修饰的
想要修改其拷贝,可以使用关键字mutable
*/
auto func = [=]() mutable ->int {
++a;
int c = a + b;
return c;
};
cout << func() << endl;
}