格式:
[函数对象参数] (形参) mutable 或 exception 声明 -> 返回值类型 {函数体}
[函数对象参数]:
[]表示表达式的开始,必须有;用来设置如何捕获匿名函数外的变量
[ ]里为空
[ ]里为空,表示任何变量都不会传递给lambda表达式,没有参数
int a = 10;
int b = 20;
int c;
int x = []()->int {return 100; }();//不能捕获匿名函数外的所有变量
std::cout << "x=" << x << std::endl;
return 0;
[=]
[=] 表示默认按值传递,编译器自动为我们按值传递了所有局部变量
按值传递:语句体内修改变量值,不会影响外面的变量值
注意:捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止
int a = 10;
int b = 20;
int c = 30;
int x = [=]()->int {int a = 100; return b + c; }();//按传值方式可以捕获所有外部变量
std::cout << "x=" << x << std::endl;
std::cout << "a=" << a << std::endl;
[&]
[&] 表示默认按引用传递
引用传递,由于两个变量指向同一个数据,所以语句体内修改变量值,会影响外面的变量值
#include <iostream>
int main() {
int a = 10;
int b = 20;
int c=30;
int x = [&]()->int {a++;std::cout << "内部a=" << a << std::endl; return b + c; }();//按引用方式可以捕获所有外部变量
std::cout << "x=" << x << std::endl;
std::cout << "外部a=" << a << std::endl;
return 0;
}
[变量名]
[var]:var是变量名,只传递变量var,其它不能传;前面可以添加&前缀,表示var变量按引用传递
[x, &y] //x 按值捕获, y 按引用捕获
int a = 10;
int b = 20;
int c;
int x = [a, b]()->int {return a + b; }();//只能捕获a和b变量,不能捕获c变量
std::cout << "x=" << x << std::endl;
[ =,&var] :引用捕获变量var,其他外部变量使用值捕获
[ &,var]:值捕获变量var,其他外部变量使用引用捕获
[this]
this:函数体内可以使用 Lambda 所在类中的所有成员变量和成员函数
#include <iostream>
class A {
public:
A(int a=0):m_i(a){}
void print() {
x= [this]()->int { return this->m_i+100; }(); //用this指针使用类成员
std::cout << "x=" << x << std::endl;
}
private:
int m_i;
int x;
};
int main() {
A d(11);
d.print();
return 0;
}
(形参)
参数列表--lambda表达式自己的参数列表
没有参数可以省略
可以按值传递,如 (a,b);也可以按引用传递,如 (&a,&b)
#include <iostream>
auto lambda = [](int value) { std::cout << "value: " << value << std::endl; }; //定义一个匿名函数
//注意:最后面没有(),所以没有执行
int main() {
lambda(56); //执行匿名函数
return 0;
}
mutable 选项(可选)--按值传递时使用
加上mutable后,在语句体内可以修改变量值;省略变量只能只读,但不会修改函数体外的值
#include <iostream>
int main() {
int a = 10;
int b = 20;
int c=30;
int x = [=]()mutable->int {a++;std::cout << "内部a=" << a << std::endl; return b + c; }();
//按值传递时,匿名函数内默认不能修改外部变量值
//加上mutable修饰符就可以修改,但是按局部变量处理
std::cout << "x=" << x << std::endl;
std::cout << "外部a=" << a << std::endl;
return 0;
}
returm-type---返回值类型
如果只有一处return时,可以省略,自动判断出类型
int ret=[]()->int{return 1000;}();