一、C++ lambda 函数详解



00:00



1. C++ lambda 函数的本质



00:05



  • 本质:lambda表达式本质上是重载了

    operator()operator()operator()

    的类,在调用时会进行编译展开

  • 别名:也称为匿名函数对象(anonymous functor),因为其实质是一个匿名的函数对象

  • 应用场景:在Qt中,槽函数可以使用lambda函数来编写

2. C++中lambda表达式的构成



00:33



  • 基本语法:

    [捕获列表](形参列表)mutable 异常列表−>返回类型函数体[捕获列表](形参列表)mutable\ 异常列表->返回类型{函数体}[捕获列表](形参列表)mutable 异常列表−>返回类型函数体

  • 组成部分:

    • 捕获列表:用于捕获外部变量,位于中括号内

    • 形参列表:与普通函数参数列表相同,可以省略

    • mutable关键字:允许修改捕获的变量(仅对值捕获有效)

    • 异常列表:与普通函数异常说明相同,可以省略

    • 返回类型:可以省略,编译器会自动推导

    • 函数体:必须包含有效代码,否则无意义

3. 三种捕获方式



01:49



1)值捕获



02:56



  • 语法:在捕获列表中直接写变量名,如

    [value][value][value]

  • 特点:

    • 捕获的是变量的副本

    • 不能在lambda表达式内修改捕获的值(除非使用mutable)

    • 示例:

      auto f=[value](int a, int b)−>intreturn a+b+value;auto\ f = [value](int\ a,\ int\ b)->int{return\ a+b+value;}auto f=[value](int a, int b)−>intreturn a+b+value;

    • 调用

      f(1,2)f(1,2)f(1,2)

      将返回

      1+2+100=1031+2+100=1031+2+100=103

      (假设value初始值为100)

2)引用捕获



04:41



  • 语法:在捕获列表中使用引用符号,如

    [&value]

  • 特点:

    • 捕获的是变量的引用

    • 可以在lambda表达式内修改捕获的值

    • 示例:

      auto\ f2 = [&value](int\ a,\ int\ b)->int{value++; return\ a+b;}

    • 调用

      f2(1,3)f2(1,3)f2(1,3)

      将返回4,同时外部value值会被修改(从100变为101)

3)隐式捕获



06:03



  • 语法:

    • 值捕获方式:

      [=][=][=]

      ,表示以值方式捕获所有外部变量

    • 引用捕获方式:

      [&]

      ,表示以引用方式捕获所有外部变量

  • 特点:

    • 简化捕获列表写法

    • 使用

      [=][=][=]

      时,所有变量以值捕获,不能修改(除非使用mutable)

    • 使用

      [&]

      时,所有变量以引用捕获,可以修改

    • 示例:

      auto f3=[=](int a, int b)...auto\ f3 = [=](int\ a,\ int\ b){...}auto f3=[=](int a, int b)...

      会以值方式捕获所有外部变量

二、知识小结

知识点

核心内容

考试重点/易混淆点

难度系数

C++ lambda函数本质

重载括号操作符的类,编译时展开为匿名函数对象

与普通函数的本质区别

⭐⭐

lambda语法结构

[捕获列表] (参数列表) mutable -> 返回类型 {函数体}

各组成部分的可省略规则

⭐⭐⭐

捕获列表类型

值捕获(复制)、引用捕获(&)、隐式捕获(=或&)

值捕获不可修改外部变量

⭐⭐⭐⭐

mutable关键字

允许修改值捕获的变量(副本)

不影响原始外部变量

⭐⭐⭐

QT槽函数应用

lambda可直接作为槽函数使用

与传统成员函数槽的差异

⭐⭐

值捕获示例

[v]复制变量,函数体内不能修改

常见编译错误场景

⭐⭐⭐

引用捕获示例

[&v]直接操作原变量,函数体内可修改

需注意变量生命周期

⭐⭐⭐⭐

隐式捕获规则

[=]自动值捕获所有变量,[&]自动引用捕获

捕获范围控制技巧

⭐⭐⭐⭐

VS2019开发实践

控制台项目创建和lambda调试方法

开发环境配置要点