一、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)...
会以值方式捕获所有外部变量