c++中的lambda表达式!

定义

lambda 表达式是 C++11 引入的一种匿名函数。它可以在需要函数对象的地方简洁地定义一个临时函数。

lambda是c++11非常重要也是常用的特性之一,它有以下优点:

  • 可以就地匿名定义目标函数或函数对象,不需要额外写一个函数
  • lambda是一个匿名的内联函数

lambda表达式定义了一个匿名函数,语法如下:

cpp 复制代码
[捕获列表](参数列表)->返回值类型{函数体};
auto fun=[](){return 0;};
auto fun=[]{return 0;};

捕获列表[]:捕获一定范围内的变量

参数列表():和普通参数列表一样,如果没有参数参数列表可以忽略不写

捕获列表

  • \]不捕获任何变量

  • =\]捕获外部作用域的所有变量,按照值捕获,拷贝过来的副本在函数体内是只读的

  • bar\] 按值捕获 bar 变量,不捕获其他变量

cpp 复制代码
int main(){
    int a=10,b=20;
    auto fl=[]{return a;};//错误,此无法访问变量 a
    auto f2=[&]{return a++;};//正确,使用引用的方式捕获变量,可读写
    auto f3=[=]{return a;};//正确,使用值拷贝的方式捕获外部变量,可读
    auto f4=[=]{return a++;};//错误,使用值拷贝的方式捕获外部变量,可读不可写
    auto f5=[a]{return a+b;};//错误,使用值拷贝的方式捕获了外部变量a,没有捕获外部变量b,所以不能访问变量b
    auto f6=[a,&b]{return a+(b++);};//正确,使用拷贝的方式捕了外部变量 a,只读,使用引用的方式捕获外部变量 b,可读写
    auto f7=[=,&b]{return a+(b++);};//正确,使用值拷贝的方式捕获所有外部变量以及 b 的引用,b 可读写,其他只读
    return 0;
}
cpp 复制代码
class Test
{
public:
    int number=100;
    void output(int x,int y){
         auto xl={return number;};//错误,没有捕获外部变量,不能使用类成员number
         auto x2=[=]{return number+x+y;};// 正确,以值拷贝的方式捕获所有外部变量
         auto x3=[&]{return number+x+y;};//正确,以引用的方式捕获所有外部变量
         auto x4=[this]{return number;};// 正确,捕获 this指针,可访问对象内部成员
         auto x5 =[this]{return number+x+y;};//错误,捕获 this指针,可访问类内部成员,没有捕获到变量x,y,因此不能访问。
         auto x6=[this,x,y]{return number+x+y;};//正确,捕获 this 指针,x,y
         auto x7=[this]{return number++;};//正确,捕获this 指针,并且可以修改对象内部变量的值
    }
};

返回值

一般情况下,不指定lambda 表达式的返回值,编译器会根据 return 语句自动推导返回值类型,但是需要注意的是lambda 表达式不能通过列表初始化自动推导出返回值类型。

cpp 复制代码
//可以自动推导出返回值类型
auto f=[](int i)
{
    return i;
};
//不能推导出返回值类型
auto f1 =[]()
{
    return {1,2};// 基于列表初始化推导返回值,错误,因为不知道返回的是链表还是数组
};
//正确显示声明了函数的返回值类型
auto fl=[]()-> vector<int>
{
    return{1,2};
}
相关推荐
XiaoLeisj1 小时前
Android Kotlin 全链路系统化指南:从基础语法、类型系统与面向对象,到函数式编程、集合操作、协程并发与 Flow 响应式数据流实战
android·开发语言·kotlin·协程
dapeng28702 小时前
分布式系统容错设计
开发语言·c++·算法
qq_417695052 小时前
代码热修复技术
开发语言·c++·算法
badhope7 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园8 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言
C++ 老炮儿的技术栈8 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl8 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
Liu628888 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
IT猿手9 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
AI科技星9 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘