lambda表达式/lambda函数/匿名函数
语法:[capture list](parameters)[mutable][throw()] -> return-type {body}
捕获列表:在C ++规范中也称为Lambda导入器,捕获列表总是出现在Lambda函数的开
始处。实际上,[]是Lambda引出符。编译器根据该引出符判断接下来的代码
是否是Lambda函数。捕捉列表不允许变量重复传递。
参数列表:与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号“()”
一起省略。
可变规格:mutable修饰符,默认情况下Lambda函数总是一个const函数,mutable可
以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空)。
异常说明:用于Lamdba表达式内部函数抛出异常。
返回类型:不需要返回值的时候也可以连同符号”->”一起省略,在返回类型明确的情
况下,也可以省略该部分,让编译器对返回类型进行推导。
函数体:内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。
附:1、除了可以使用参数以外,Lambda函数可以通过捕获列表访问一些上下文中的数据。
2、lambda表达式不能有默认参数。
3、所有参数必须有参数名。
4、不支持可变参数(以传值方式捕获外部变量,则在Lambda表达式函数体中不能修
改该外部变量的值)。
例://不捕获变量
auto fun = ([] {
std::cout << "Hello World!" << std::endl;
}
);
fun();
//值传递方式捕获指定变量
int a = 10;
auto fun = ([a] {
std::cout << a << std::endl;
}
);
fun();
//值传递方式捕获父作用域变量
int a = 10;
int b = 20;
auto fun = ([=] {
std::cout << a << std::endl;
std::cout << b << std::endl;
}
);
fun();
//引用传递方式捕获指定变量
int a = 10;
auto fun = ([&a] {
return ++a;
}
);
int b = fun();
std::cout << b << std::endl;
//引用传递方式捕获父作用域变量(包括this指针)
int a = 10;
int b = 20;
auto fun = ([&] {
a++;
b++;
}
);
fun();
std::cout << a << std::endl;
std::cout << b << std::endl;
//拷贝+引用,注意变量的重复传递(例如:[=,b])
int a = 10;
int b = 20;
auto fun = ([=, &b] {
std::cout << (b += a) << std::endl;
}
);
fun();
//引用+拷贝,注意变量的重复传递(例如:[&,&b])
int a = 10;
int b = 20;
auto fun = ([&, b] {
std::cout << (a += b) << std::endl;
}
);
fun();
//形参接收
auto fun = ([](int a, int b) -> int {
return a > b ? a : b;
}
);
int c = fun(10, 20);
std::cout << c << std::endl;
//可变规格(默认情况下lambda函数总是一个const函数,mutable可以取消其常
量性)
int a = 0;
int b = 0;
[=](int c) mutable {
a = ++b + c;
std::cout << a << std::endl;
std::cout << b << std::endl;
}(4);
C++ Lambda表达式
最新推荐文章于 2024-04-23 20:56:09 发布