捕获列表
用于指定Lambda表达式可以访问的外层作用域中的变量。捕获方式有值捕获、引用捕获和混合捕获。
[ ] 不捕获任何变量
[&] 捕获外作用域中的所有变量
[=] 捕获外作用域中的所有变量,按照值捕获,拷贝过来的副本在函数体内是只读的
[=,&a] 按值捕获外作用域中的所有变量,并且按照引用捕获外部变量a
[bar] 按值捕获 bar 变量,不捕获其他变量
[this] 捕获当前类中的 this 指针,让 lambda 表达式拥有和当前类成员函数同样的访问权限。
int main(){
int a=10, b=20;
auto fl=[]{return a;};
//错误,没有捕获外部变量,因此无法访问变量 a
auto f2=[&]{return a++;};
//正确,使用引用的方式捕获外部变量,可读写
auto f3=[=]{return a;};
//正确,使用值拷贝的方式捕获外部变量,可读
auto f4=[=]{return a++;};
//错误,使用值拷贝的方式捕获外部变量,可读不能写
auto f5=[al{return a+b;};
//错误,使用拷贝的方式捕获了外部变量 a,没有捕获外部变量 b,因此无法访问变量 b
auto f6=[a,&b]{returna+(b++);};
//正确,使用拷贝的方式捕获了外部变量 a,只读,使用引用的方式捕获外部变量 b,可读写
autof7=[=,&b]{returna+(b++);};
//正确,使用值拷贝的方式捕获所有外部变量以及 b 的引用,b 可读写,其他只读
return 0;
}
返回值类型
指定Lambda表达式的返回类型。一般情况下,不指定 lambda 表达式的返回值,编译器会根据 return 语句自动对到返回值类型,但是需要注意的是,lambda 表达式不能通过列表初始化自动推导出返回值类型。
// 可以自动推导出返回值类型
auto f=[](int i){
return i
}
//不能推导出返回值类型
auto fl =[](){
return{1,2};// 基于列表初始化推导返回值,错误
}
//正确显示声明了函数的返回值类型
auto f1=[]()-> vector<int>{
return{1,2};//基于列表初始化推导返回值,错误
};