简单介绍
lambda表达式是c++11标准引入的新特性,用于函数的内嵌(与内联函数本质相同),用于创建匿名函数。
基本形式
[captrue list] (parameter list) mutable-> return type or exception { function body}
- captrue list捕获列表,必须出现在表达式开始,用于捕获上下文变量;
- parameter list参数列表,非必须,如果没有参数,可以和参数括号一起省略不写;
- mutable,mutable修饰,lambda表达式默认为const函数,mutable可以改变函数常量性,如果使用mutable,参数列表不可省略;
- ->return type or exception尾置返回类型或异常,对于有明确返回值的函数,可以连同 -> 一起省略不写
- function body函数体,可以使用参数列表中的参数,还可以使用捕获列表捕获的变量。
捕获列表
[captrue list]用于捕获上下文变量,交给表达式函数体使用。
捕获列表形式 | 作用 |
---|---|
[=] | 按值传递,捕获父域所有变量(包括this指针) |
[&] | 传引用,捕获父域所有变量(包括this指针) |
[this] | 按值传递,捕获this指针 |
[var] | 按值传递,捕获变量var |
[&var] | 传引用,捕获变量var |
[=,&var] | 传引用捕获变量var,按值传递捕获其余所有变量 |
[&,var] | 按值传递捕获变量var,其余所有变量传引用捕获 |
注意:[=,var],[&,&var]的写法不正确,编译器会报错。
捕获列表中传值与传引用的区别:
#include <iostream>
using namespace std;
int main()
{
int a = 10;
//1
auto lambda_val = [a]()->int{return a+1;};
auto lambda_ref = [&a]()->int{return a+1;};
//2
cout << "val " << lambda_val() << endl;
cout << "ref " << lambda_ref() << endl;
//3
a++;
cout << "val " << lambda_val() << endl;
cout << "ref " << lambda_ref() << endl;
return 0;
}
运行结果:
分析:
在(1)处,lambda_val()中捕获到a,在lambda_val()函数内部,a已经被拷贝赋值;lambda_ref()中捕获到a的引用,实际操作的还是父域中的a;
在(3)处,lambda_val()中a还是(1)拷贝来的10,输出a+1=11;lambda_ref()中(1)捕获的a的引用,由于受到父域a++,a=11的影响,返回a+1=12。
lambda表达式参数列表、返回值、函数体与普通函数基本相同。
QT中connect()支持lambda表达式
在信号槽的连接中,lambda表达式可以作为没有接收者的槽函数,直接用于接收QT的信号,并做出处理。