C++ 之lambda表达式
C++ 之lambda表达式
[capture](parameters) option -> return-type { body }
capture:捕获列表,可选
捕捉列表总是出现在 lambda 表达式的开始。实际上,是 lambda 引出符,编译器根据该引出符判断接下来的代码是否是 lambda 表达式。
捕捉列表能够捕获上下文中的变量,以在 lambda 表达式内使用,主要有如下几种情况:
# 不捕获任何变量
[]
# 按引用捕获外部作用域中所有变量,在 lambda 表达式内使用
[&]
# 按值捕获外部作用域中所有变量,在 lambda 表达式内使用
# 按值捕获的变量,在 lambda 表达式内是只读的,不能修改赋值
[=]
# 捕获外部作用域中所有变量,其中foo变量按引用捕获,其他的按值捕获
[=, &foo]
# 按值捕获bar变量,同时不捕获其他变量
[bar]
# 捕获当前类中的 this 指针
# 捕获了 this 就可以在 lambda 中使用当前类的成员变量和成员函数。
# 如果已经使用了 & 或者 =,就默认添加此选项。
[this]
parameters:参数列表,可选
option:函数选项,可选
return-type:返回值类型,可选。没有返回值的时候也可以连同符号一起省略
body:函数体
// 匿名函数的定义
[]() {
cout << "匿名函数" << endl;
};
// 匿名函数的调用
[]() {
cout << "匿名函数的调用" << endl;
}();
int a = 10;
//[]() { // 不捕获任何变量
// cout << a;
//}();
// 按引用捕获
[&]() {
cout << a++ << endl;
}();
cout << a << endl;
// 按值捕获(只读, 不能修改)
//[=]() {
// cout << a++ << endl; //报错
//}();
//cout << a << endl;
// 按值捕获 (可修改,但属于按值传递, 不影响外部变量的值)
[=]() mutable {
cout << a++<<endl; // 10
}();
cout << a << endl;;
// 有参的匿名函数
[](int x, int y) {
cout << x << "+" << y << "=" << x + y << endl;
}(1,2);
// 匿名函数的返回值
// 返回值可以省略 编译器会自动推断返回值的类型
int sum = [](int x, int y) -> int{
return x + y;
}(1,2);
cout << sum << endl;
int sum1 = [](int x, int y) {
return x + y;
}(3, 2);
cout << sum1 << endl;