lambda表达式
首先看一下lambda表达式的格式
[外部变量访问方式说明符] (参数表) -> 返回值类型
{
语句块
}
其实lambda表达式就是一个简单的函数
格式里面的参数,返回值,语句块 都是普通函数的参数 返回值和函数体
前面的访问方式说明符有两种 [&] [=]
[=] 表示变量不可被修改
[&] 和[=]相反,表示变量可以被修改
举个栗子
int main(int argc,char *argv[]) { auto fun = [=](int a)->int { return a; }; cout << fun(6) << endl; return 0; }
输出自然是6,这个表达式就相当于这样一个函数 输出一个int 然后return这个int
如果我将这个例子稍加改动,在return 之前先改一下a,那就要用[&]
int main(int argc,char *argv[]) { auto fun = [&](int &a)->int { a++; return a; }; int a = 6; cout << fun(a) << endl; return 0; }
当然了也可以不写返回值,这样编译器会自动识别你的返回值,如果没有返回值就返回void
int main(int argc,char *argv[]) { auto fun = [&](int &a){ a++; return a; }; int a = 6; cout << fun(a) << endl; return 0; }
[=, &x, &y] 表示外部变量 x、y 的值可以被修改,其余外部变量不能被修改;
[&, x, y] 表示除 x、y 以外的外部变量,值都可以被修改。
甚至我还可以没有参数列表
int main(int argc,char *argv[]) { auto fun = [&](){ cout << "a" <<endl; }; fun(); return 0; }
看下面这个例子
int b = 8; int main(int argc,char *argv[]) { static int a = 6; auto fun = [&](){ a++; return a+b; }; cout <<fun()<<endl; return 0; }
输出值为15
我没有传入参数,但是他能使用我前面定义过的全局变量和静态变量。
int b = 8; int main(int argc,char *argv[]) { static int a = 6; int c = 8; auto fun = [=](){ a++; return c = a+b+c; }; cout <<fun()<<endl; return 0; }
这个代码就是错误的,因为在函数体里面改变了c的值,但是访问说明符是[=]
所以要改成
int b = 8; int main(int argc,char *argv[]) { static int a = 6; int c = 8; auto fun = [&](){ a++; return c = a+b+c; }; cout <<fun()<<endl; return 0; }
这样才能得出正确结果23