定义C11引入的匿名函数对象用于简化代码可以替代传统的仿函数。核心功能在作用域内捕获变量并定义轻量级的局部函数逻辑语法[捕获列表](参数类型)-返回类型{ 函数体 }捕获列表Capture List指定如何从外部作用域捕获变量。参数列表Parameter List与普通函数的参数列表一致。返回类型Return Type可省略编译器自动推导复杂时需显式声明。函数体Body执行逻辑。为什么说lambda的出现替代了仿函数首先仿函数需要定义类类里面有构造函数重写operator外部就直接将创建的对象当函数去使用。仿函数需要显式声明类型。lambda直接将对象当作函数去使用不需要定义类因为编译器就自动生成仿函数类代码更加的简洁要用到外部参数就直接捕获不需要进行传参捕获的方式还哪有很多种类型可以自动推导。编译器遇到 lambda 时会将其转换为仿函数类// 你的代码 int sum 0; auto dfs [](int x) { sum x; }; ​ // 编译器生成的代码 class __lambda_12345 { private: int sum; // 捕获的变量作为成员 public: __lambda_12345(int s) : sum(s) {} // 构造函数 void operator()(int x) const { // operator() sum x; } }; ​ __lambda_12345 dfs(sum); // 创建对象lambda的使用场景如果逻辑是一次性的局部的可以优先使用比如递归遍历算法自定义比较一次性使用的回调递归遍历// 前序遍历收集所有节点值 vectorint result; auto dfs [](this auto dfs, TreeNode* node) - void { if (!node) return; result.push_back(node-val); // 访问根 dfs(node-left); // 递归左 dfs(node-right); // 递归右 }; dfs(root);一次性使用的回调vectorint nums {1, 2, 3, 4, 5}; ​ // 只使用一次的回调 sort(nums.begin(), nums.end(), [](int a, int b) { return a b; // 降序 }); ​ // 找出第一个大于 3 的元素 auto it find_if(nums.begin(), nums.end(), [](int x) { return x 3; }); ​ // 遍历并打印 for_each(nums.begin(), nums.end(), [](int x) { cout x ; }); ​ // 带捕获的回调 int sum 0; for_each(nums.begin(), nums.end(), [](int x) { sum x; // 累加 });但是复杂的场景需要复用多次多版本的operator()还是用仿函数。