当前位置: 首页 > news >正文

4、匿名函数lambda的使用

一、格式

[捕获列表](参数列表)mutable(可选) 异常属性->返回类型{
//函数体
}

  • 捕获列表是可以自动捕获参数的。
  • 一般编译器可以自己推断出返回类型,所以可以不用写。 如下:
[捕获列表](参数列表){函数体}

二、捕获列表

1、按值和引用传递

  • 捕获列表是可以自动捕获参数的。
void test(){
    int c =12;
    int d =30;
    int e = 10;
    auto add =[c,d,&e](int a,int b)->int{
        cout<<"d="<<d<<endl;
        cout<<"e="<<e<<endl;
        return c;
    };
    d=20;
    e=20;
    cout<<add(1,2)<<endl;
}
int main(){
    test();
    //d=30
    //e=20
    //12
}

2、隐式捕获

  • 手动写捕获列表有时候是非常复杂的,这种机械的工作可以交给编译器来处理,这时候可以在捕获列表中写一个**&或=向编译器声明采用引用捕获或者值捕获**。
  • [=]就可以使用外面的变量了,但是是const类型。 [&]也可以使用外面的变量。
void test(){
    int c =12;
    int d =30;
    auto add =[&](int a,int b)->int{
        c=a;
        cout<<"d="<<d<<endl;
        return c;
    };
    d=20;
    cout<<add(1,2)<<endl;
    cout<<"c="<<c<<endl;
}
int main(){
    test();
    //d=20
    //1
    //c=1
}

3、空捕获列表

捕获列表[]中为空,表示lambda不能使用所在函数中的变量

void test(){
    int c =12;
    int d =30;
    auto add =[](int a,int b)->int{
        c=a;//编译错误
        cout<<"d="<<d<<endl;//编译错误
        return c;//编译错误
    };
    d=20;
    cout<<add(1,2)<<endl;
    cout<<"c="<<c<<endl;
}

4、表达式捕获

以上3种捕获都是左值捕获,如果要右值捕获使用的是 c++14

void test{
    auto important = make_unique<int>(1);
    auto add=[v1=1,v2=std::move(important)](int x,int y)->int{
        return x+y+v1+(*v2);
    };
}

5、泛型lambda

C++14之前lambda表示的形参只能指定具体的类型,没法泛型化。C++14后,lambda函数的形式参数可以使用auto关键字来产生意义上的泛型:

void test(){
    auto add = [](auto x,auto y){
        return x+y;
    };
}

6、可变lambda

  • 采用值捕获的方式,lambda不能修改其值,如果要修改,使用mutable修饰。
  • 采用引用捕获的方式,lambda可以直接修改其值。

相关文章:

  • 从碎片化到标准化:案例详解 MCP 如何重塑 AI Agent 开发生态?
  • 嵌入式基础知识学习:UART是什么?
  • Elasticsearch:可配置的推理 API 端点分块设置
  • 并查集——108. 冗余连接
  • Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)
  • HCL—我与虚拟机的爱恨情仇[特殊字符][特殊字符]‍[特殊字符]️
  • C++ --- 多态
  • 破解PDF转Word难题:如何选择高效、安全的转换工具?
  • C++核心语法快速整理
  • 【redis】事务详解,相关命令multi、exec、discard 与 watch 的原理
  • 操作系统核心问题解析(目的/定位、管理思想:先描述,再组织、 库函数与系统调用的关系)
  • 使用 ncurses 库创建文本用户界面:基础函数详解
  • RK3588开发笔记-DDR4降频实战与系统稳定性优化
  • Jmeter分布式测试的注意事项和常见问题
  • 基于linux平台的C语言入门教程(2)变量与常量
  • NLP高频面试题(十)——目前常见的几种大模型架构是啥样的
  • WSL 导入完整系统包教程
  • DeepSeek AI大模型工作机制及未来方向
  • PyTorch核心基础知识点
  • Pear Admin Flask 开发问题
  • 海口市政协党组成员、秘书长、机关党组书记汪娟被查
  • 浦发银行一季度净利175.98亿增1.02%,不良率微降
  • 电话费被私改成48元套餐长达数年,投诉后移动公司退补600元话费
  • 癌症来临前,可能伪装成这几种常见病,千万别大意
  • 大学男生被捉奸后将女生推下高楼?桂林理工大学辟谣
  • 广州海关原党委委员、副关长刘小威被开除党籍