Lambda表达式用于定义并创建匿名的函数对象,以简化工作。
形式:[函数对象参数 ]( 操作符重载函数参数){ }
[ ]表示Lambda的开始,不能省略。其中的函数对象参数通常使用=。
1).[ ]空没有任何使用
2).[ =]Lambda的函数体内(也就是{ }内)可以使用Lambda所在作用范围内所有可见的局部变量,包括所在类的this。采用值传递的方式,即编辑器按值传递了所有变量
3).[ &] 表示{ }内可以使用Lambda所在作用范围内所有可见的局部变,包括所在类的this。采用引用的传递方式,即编译器按引用传递了所有局部变量
4).[ this]函数体内可以使用Lambda所在类中的成员变量
5).[ i ]将i按值进行传递。按值传递时,在函数体内不能修改传递进来的拷贝,因为默认函数时const的。可以添加mutable修饰符修改传递进来的拷贝。(注意:修改的是拷贝,原值不会发生改变)
6).[&i]将i按引用进行传递
7).[i,&j]将i按值进行传递,j按引用进行传递
8).[=,&i,&j]除i和j按引用进行传递,其他参数都按值进行传递
9).[&,i,j]除i和j按值进行传递,其他参数都按引用进行传递
()操作符重载函数参数
标识重载的()的参数,没有参数时,这部分可以省略。参数可以通过按值(i,j)和按引用(&i,&j)两种方式进行传递。
可修改标示符mutable
mutable声明,可以省略。按值传递函数对象参数时,加上mutable后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。
int m = 10;
[m] ()mutable {
m = 100 + 10; //修改的是拷贝,其本身没有修改
qDebug() << m;
};
函数返回值;
用->返回值类型,标识函数返回值的类型。当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。
int i = [ ]( ){return 100;} ( ); //最后一个括号表示调用这个函数, [ ]( ){ }只是函数的说明