构造一个闭包:一个能在作用域内捕捉变量 的匿名函数对象。
语法
[capture](params) mutable exception attribute -> ret{body},完整的声明
[capture](params) -> ret {body},一个常lambda声明:按副本捕捉的对象不能被修改
[capture](params){body},省略后缀返回值类型:
闭包的operator()的返回值类型是根据一下规则推到的:
如果body仅含有单一的return语句,那么返回值类型是返回表达式的类型(隐式转换之后的类型:右值到左值、数组到指针、函数到指针)
否则,返回类型是void
[capture]{body}
省略参数列表:函数没有参数,即参数是()
====================
mutable--允许body修改传值进来的形参,以及调用他们的非const成员函数
exception--提供闭包类型的operator()成员函数的异常说明或noexcept语句
attribute--提供闭包类型的operator()成员函数的属性说明
capture--指定哪些在函数声明处的作用域可见到的符号 将在函数体内可见
符号表可按如下规则传入:
[a,&b]按值捕获a,并按引用捕获b
[this] 按值捕获了this指针
[&] 按引用 捕获 lambda表达式所在函数的函数体中 所有的外部变量
[=] 按值 捕获在lambda表达式所在函数的函数体中提及的 所有外部变量
[]什么也不捕获
params--参数列表,与命名函数一样
ret--返回值类型,如果不存在,由该函数return语句来隐式决定(或void,当它不凡会任何值的时候)
body--函数体
=================
来自http://my.oschina.net/wangxuanyihaha/blog/18315
lambda表达式用于创建并定义匿名的函数对象,来简化编程工作。
简化的语法可以看作,
[函数对象参数] (操作符重载函数参数) ->返回值类型 {函数体}
vector<int> iv{5, 4, 3, 2, 1}; int a = 2, b = 1; for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x + b)<<endl;}); // (1) for_each(iv.begin(), iv.end(), [=](int &x){x *= (a + b);}); // (2) for_each(iv.begin(), iv.end(), [=](int &x)->int{return x * (a + b);});// (3)
- []内的参数指的是lambda表达式可以取得的全局变量,1函数中的b就是指函数可以得到lambda表达式外的全局变量,如果在[]中传入=的话,就是可以取得所有的外部变量,如果2和3中的lambda表达式
- ()内的参数每次调用函数时传入的参数
- ->后加上的是lambda表达式返回值的类型,如3返回了int类型的变量。