C+++11中,用lambda表达式来定义并创建匿名的函数对象,即没有函数名的函数;
1.完整格式:
[capture list] (params list) mutable exception-> return type { function body }
各项具体含义如下
(1)capture list:捕获外部变量列表
(2)params list:形参列表(可缺省)
(3)mutable指示符:用来说用是否可以修改捕获的变量(可缺省)
(4)exception:异常设定(可缺省)
(5)return type:返回类型(可缺省)
(6)function body:函数体
2.应用举例
[=](int a, long b) mutable exception -> int {
if(a==2)
return 0;
else
return 1;
}
int a=100;
auto f = [a]()mutable { std::cout << ++a; };
//lambda表达式
connect(b1,&QPushButton::released,this,
[=]()
{
b2->setText("lambda");
}
);
3.使用情景:
在函数体较短,不想再添加一个新的函数(声明和成员函数)来供当前位置调用的情况下,可以使用lambda表达式,提供方便。
4.说明:
【Lambda表达式的本质是“匿名方法”,即当编译我们的程序代码时,“编译器”会自动将“Lambda表达式”转换为“匿名方法”】
(1)捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
(2)Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。
(3)Lambda 表达式中的返回语句不会导致封闭方法返回。
(4)Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。
(5)如果“语句或语句块”有返回值时,如果只有一条语句则可以不输写“return”语句,编译器会自动处理,否则必须加上。
(6)如果捕获的变量在函数体中被修改,应在表达式构成中加上 mutable 关键字。