原文链接
理解说明
[已经声明的成员](传参)->(return type){
函数实现
}
并且
auto 函数指针 = [已经声明的成员](传参)->(return type){
函数实现
这个可能难以理解
换个说明方式
首先声明一个函数指针
int CMP(int i)
{
return (++i);
}
int(* f)(int) = CMP;
i = f(4);
这个时候值为i的值为5;
接下来换成lambad表达式
auto f = [=](int A)->int {return (++A) ; };
i = f(4);
这个时候i的值依旧为5
上面两个代码比较:两个f的作用为一样的,所以可以短暂的将lambad表达式理解为一个没有匿名函数,而f就是这个lambad表达式的函数指针
[]中括号中的捕获需要注意的事项
先引用一个图片
函数声明:
static int z = 3;
int i = 3;
int j = 3;
//捕获值为空,默认不捕获上方的成员变量,但z为静态成员,所以可以使用
auto f = [](int A )->int {return A+ z; };
//错误,i为成员函数,没有捕获所以不能使用
auto f = [](int A)->int {return A + i; };
//值捕获方式,所以可以使用
auto f1 = [=](int A)->int {return j+i; };
//引用捕获方式,j和i都可以使用
auto f2 = [&](int A)->int {return j+i; };
//错误,默认引用捕获,后方的i不能在使用引用捕获
auto f3 = [&,&i](int A)->int {return (++A); };
//j和i都是引用捕获
auto f4 = [&j,&i](int A)->int {return (++A); };
//默认值捕获,i采用引用捕获
auto f5 = [=, &i](int A)->int {return (++A); };
//错误,其余值引用捕获,只需要单独声明i,不需要在添加=
auto f6 = [&, =i](int A)->int {return i+1; };
//其余值引用捕获,只需要单独声明i,不需要在添加=
auto f7 = [&, i](int A)->int {return i + 1; };
//错误,默认为值捕获,所以不能添加=
auto f8 = [=j, =i](int A)->int {return i + 1; };
//默认为值捕获,所以不能添加=
auto f9 = [j, i](int A)->int {return i + 1; };
参数列表
需要注意的是,lambad表达式中的参数不可以像普通函数一样省略声明,但可以设置缺省值
int i = 3;
int j = 3;
//正确
auto f = [&](int A)->int {return A + j; };
//错误 不认识A
auto f1 = [&](int )->int {return A + j; };
//输出值为5 ,因此可以有缺省值
auto f3 = [&](int A=2)->int {return A + j; };
i = f3();
auto f3 = [&](int A=2, int B = 4)->int {return A +B+ j; };
i = f3(3);
返回值
正确
auto f1 = [&](int A=2, int B = 4)->int {return A +B+ j; };
错误,没有返回值 应改为{return A + B + j; }
auto f2 = [&](int A = 2, int B = 4)->int { A + B + j; };
正确,但无法使用 i=f3
auto f3 = [&](int A = 2, int B = 4){ A + B + j; };
正确,隐藏->int 但使用时i=f4时没有问题
auto f4 = [&](int A = 2, int B = 4) { return A + B + j; };
函数体
static int z = 3;
int i = 3;
int j = 1;
//对于静态成员,使用与普通函数一样
auto f1 = [&]() { ++z; };
auto f2 = [=]() { ++z; };
auto f3 = [&]() { ++j; };
//错误,值捕获,无法修改j,不能修改外部值
//auto f4 = [=](){ ++j; };
auto f5 = [&,j]() { i=j+1; };