lambda 表达式
对于一个对象或一个表达式,如果可以对其使用调用运算符( . ),则称它为可调用的。可调用对象有四种,函数、函数指针、重载了函数调用运算符的类,以及 lambda 表达式。
lambda 表达式可以理解为一个未命名的内联函数,具有如下形式
[capture list] (parameter list) -> return type { function body }
// capture list 捕获列表是一个 lambda 所在函数中定义的局部变量的列表(通常为空)
// 可以忽略参数列表和返回类型,但必须包含捕获列表和函数体
// lambda 必须使用尾置返回
auto f = [] { return 42 };
cout << f() << endl; // 打印42
一个 lambda 只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体中使用该变量
auto compare_with_hello() {
string hello = "hello";
return [hello](string a){ return hello.size() > a.size(); };
}
int main() {
auto f = compare_with_hello();
cout << f("aa") << flush; // 输出1
}
隐式捕获
可以让编译器根据 lambda 体中的代码推断我们要使用哪些变量
[=] // 值捕获方式
[&] // 引用捕获方式