auto f= [] { return 2; }
lambda可以推断返回类型当且仅当函数体中只是一个return语句。如果lambda的函数包含任意单一return 语句之外的内容,且未定返回类型,则返回void。
auto = [] (int i) -> int
{ if(i>0) return 1; else return -i;};
auto f=[] ->int {return 1;}; //错误
auto f=[] {return 1;}; //正确
int i=1;
auto f=[i] {return i;};
i=2;
auto temp= f(); //temp值为1
注:这是因为lambda表达式其实是重载函数调用运算符的类。
值捕获变量在函数体中不能改变(隐含的值捕获变量是const),可以使用mutable关键字。用mutable时不能省略参数列表(及时没有参数也要写())
int i=1;
auto f=[i] () mutable { i =3; };
int i=1;
auto f=[&i]{return i;};
i=2;
auto temp=f(); //temp值为2;
int i=1;
auto f1=[=]{return i;} //值捕获
auto f2=[&]{return i;} //引用捕获
[ ] | 空捕获列表 |
[ names ] | names是一个用逗号分割的名字列表,默认是值捕获,名字前加&使用引用捕获 |
[ & ] | 隐式引用捕获 |
[ = ] | 隐式值捕获 |
[ & ,identifier list ] | identifier list是一个用逗号分割的列表,只能用值捕获(名字前不能加&) |
[ = ,identifier list ] | identifier list是一个用逗号分割的列表,只能用引用捕获(名字前要加&) |
auto g= bind(fun,a,b,_2,c,_1);
当调用g时,如:
g(g1,g2);
映射为:
fun(a,b,g2,c,g1);
注意:bind函数和lambda一样,在绑定时就拷贝对象,不是在调用时才拷贝。
int temp=1;
auto g=bind(fun,temp,_1);
temp=2;
g(2); //->fun(temp,2) temp值为1
函数头文件为
auto g=bind(fun,_1,ref(a),cref(b));
ref和cref都定义在