Lamada
以往C++需要传入一个函数的时候,必须事先进行声明,视情况可以声明为一个普通函数然后传入函数指针,或者声明一个函数对象,然后传入一个对象。而Lamada表达式提供了一个类似匿名函数的特性,即在需要一个函数,而又不想费力去命名一个函数的情况下使用
形式:
[捕获列表(函数对象参数)](参数列表) mutable或exception声明(可选) -> 返回类型{
//函数体
}
- 函数对象参数是传递给编译器自动生成的函数对象类的构造函数的,不能省略;函数对象参数只能使用那些到定义Lamada为止时Lamada所在范围内可见的局部变量(包括Lamada所在类的this)
值捕获
与参数传值类似,值捕获的前期是变量可以拷贝,不同之处则在于,被捕获的变量在 lambda 表达式被创建时拷贝,而非调用时才拷贝
void learn_lambda_func_1() {
int value_1 = 1;
auto copy_value_1 = [=] {
return value_1;
};
value_1 = 100;
auto stored_value_1 = copy_value_1();
// 这时, stored_value_1 == 1, 而 value_1 == 100.
// 因为 copy_value_1 在创建时就保存了一份 value_1 的拷贝
}
引用捕获
与引用传参类似,引用捕获保存的是引用,值会发生变化。
void learn_lambda_func_2() {
int value_2 = 1;
auto copy_value_2 = [&] {
return value_2;
};
value_2 = 100;
auto stored_value_2 = copy_value_2();
// 这时, stored_value_2 == 100, value_1 == 100.
// 因为 copy_value_2 保存的是引用
}