语法形式:[ capture ] ( params ) opt -> ret { body; }
注意:
-
允许省略返回值类型,编译器会自动推导出返回类型。
-
在没有参数列表时,可以省略参数列表即小括号
-
[] 表示不捕获任何变量;
[&] 捕获外部作用域所有变量,且作为引用在函数体中使用(按引用捕获)
[=]捕获外部作用域所有变量,且作为副本使用(按值捕获)
[=, &foo] 除了foo变量是按引用捕获,其它变量按值捕获
[bar]按值捕获bar变量
[this]捕获当前类的this指针,让lambda函数体内可以访问对象的成员函数和成员变量 -
lambda表达式按值捕获的一瞬间,值已经被复制到lambda表达式里了,后面再改值,不会影响lambda表达式!!可以按引用捕获可以解决这个问题。
int a = 0;
auto f1 = [a] { return a; };
auto f2 = [&a] { return a; };
a++;
std::cout << f1() << std::endl; // 输出0!!!
std::cout << f2() << std::endl; // 输出1!!!
- 没有捕获变量的lambda表达式可以直接转换为函数指针,而捕获变量的lambda表达式无法转换为函数指针
using func_t = int(*)(int);
func_t f = [](int a) { return a;}; // OK
func_t f2 = [=](int a) { return a; }; // error,有状态的lambda不能直接转换为函数指针