lambda 表达式

对于一个对象或一个表达式,如果可以对其使用调用运算符( . ),则称它为可调用的。可调用对象有四种,函数、函数指针、重载了函数调用运算符的类,以及 lambda 表达式。
lambda 表达式可以理解为一个未命名的内联函数,具有如下形式

  1. [capture list] (parameter list) -> return type { function body }
  2. // capture list 捕获列表是一个 lambda 所在函数中定义的局部变量的列表(通常为空)
  3. // 可以忽略参数列表和返回类型,但必须包含捕获列表和函数体
  4. // lambda 必须使用尾置返回
  5. auto f = [] { return 42 };
  6. 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 体中的代码推断我们要使用哪些变量

[=]  // 值捕获方式
[&]  // 引用捕获方式