Lambda 表达式是 C++11 引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而无需单独命名函数
[capture clause](parameters) -> return_type {// 函数体
// 可以使用捕获列表中的变量
return expression; // 可选的返回语句
}
- 捕获列表(Capture clause):用于捕获外部变量,在 Lambda 表达式中可以访问这些变量。捕获列表可以为空,也可以包含变量列表 [var1, var2, ...]。
- 参数列表(Parameters):与普通函数的参数列表类似,可以为空或包含参数列表param2, ...)。
- 返回类型(Return type):Lambda 表达式可以自动推断返回类型auto,也可以显式指定返回类型 > return_type。如果函数体只有一条返回语句,可以省略返回类型。
- 函数体(Body):Lambda 表达式的函数体,包含需要执行的代码。
int main(int argc, char *argv[])
{int x=10,y=200;auto add = [](int a,int b)->int{return a+b;};int c=add(x,y);cout<< c;return 0;}
int main(int argc, char *argv[])
{int x=10,y=200;auto max = [](int a,int b)->auto{return a > b;};cout << max;return 0;}
lambda调用错误写法:
int main(int argc, char *argv[])
{int x=10,y=200;auto add = [x,y]()->int{return x+y;};cout << add;return 0;}
正确写法:
int main(int argc, char *argv[])
{int x=10,y=200;auto add = [x,y]()->int{return x+y;};cout << add();return 0;}
这种方式捕获变量是不能修改变量的,只可读
int main(int argc, char *argv[])
{int x=10,y=200;auto add = [x,y]()->int{//x++;//x = 15;//这种方式捕获变量是不能修改变量的,只可读return x+y;};int ret = add();cout << ret;return 0;}
捕获形式 | 含义 |
[ ] | 空捕获(全局和局部静态仍然可见) |
[=] | 隐式值捕获,值捕获lambda前面的变量 |
[names] | 一个逗号分隔的捕获变量列表 |
[&] | 隐式引用捕获 |
[&,a] | 除了a外的所有外部变量都为引用 |
[&x,y] | 按引用捕获x,按值捕获y |
int main(int argc, char *argv[])
{static int x=10,y=200;auto add = []()->int{return x+y;};int a=10;int ret = add();cout << ret;return 0;}
int main(int argc, char *argv[])
{int x=10,y=200;auto add = [&,y]()->int{x++;return x+y;};int a=10;int ret = add();cout << ret;return 0;}
int main(int argc, char *argv[])
{int x=10,y=200;auto add = [&x,y]()->int{// 按引用捕获x,按值捕获yx++;return x+y;};int a=10;int ret = add();cout << ret;return 0;}