C++ lambda表达式

C++ lambda表达式

Lambda 表达式是 C++ 中的一个功能,它允许你创建匿名函数。Lambda 表达式的通用语法如下:

[capture](parameters) mutable -> return_type { body }

各部分的含义如下:

  1. capture:捕获列表,定义了从外部作用域捕获哪些变量以及如何捕获(按值或按引用)。
  2. parameters:参数列表,与普通函数的参数列表类似。
  3. mutable:如果使用了这个关键字,可以修改按值捕获的变量。
  4. return_type:返回类型,可以显式指定,也可以让编译器自动推断。
  5. body:函数体,包含了 lambda 表达式要执行的代码。

捕获列表(Capture)的几种形式:

  1. 不捕获任何外部变量

    []{ /* code */ }
    
  2. 按值捕获所有外部变量

    [=]{ /* code */ }
    
  3. 按引用捕获所有外部变量

    [&]{ /* code */ }
    
  4. 按值捕获特定变量

    [x]{ /* code */ }
    
  5. 按引用捕获特定变量

    [&x]{ /* code */ }
    
  6. 混合捕获模式

    [x, &y]{ /* code */ }
    
  7. 隐式捕获某些变量,显式捕获其他变量

    [=, &x]{ /* code */ }
    [&x, y]{ /* code */ }
    

例子与解释:

  1. 不捕获任何外部变量

    []{ return 42; }
    

    一个简单的 lambda,不使用任何外部变量,返回 42。

  2. 按值捕获外部变量

    int x = 1;
    auto l = [=]{ return x + 1; };
    

    这个 lambda 按值捕获 x,返回 x + 1 的结果。

  3. 按引用捕获外部变量并修改

    int x = 1;
    auto l = [&x]{ ++x; };
    

    按引用捕获 x 并在 lambda 内部对其进行修改。

  4. 具有参数的 lambda

    auto l = [](int a, int b){ return a + b; };
    

    一个接受两个整数参数并返回它们的和的 lambda。

  5. 可变 lambda(修改按值捕获的变量)

    int x = 1;
    auto l = [x]() mutable { return ++x; };
    

    mutable 关键字允许 lambda 修改按值捕获的变量。

  6. 带有显式返回类型的 lambda

    auto l = [](int a, int b) -> double { return (a + b) / 2.0; };
    

    一个计算平均值的 lambda,显式指定返回类型为 double

Lambda 表达式在 C++11 及更高版本中非常有用,特别是在需要简洁的回调函数、临时函数对象或在 STL 算法中使用的场合。在 Qt 中,lambda 通常用于信号和槽的连接,因为它们可以简化代码并提高可读性。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++ Lambda表达式是一种简洁的匿名表示方法,可以在代码中定义并使用。Lambda表达式的格式一般为:[] (参数列表) mutable -> 返回值类型 { 表达式 }。Lambda表达式可以捕获外部变量,并将其作为参数传递给函数体部分进行处理。Lambda表达式在使用时可以作为函数对象、函数指针或者函数参数进行传递。 Lambda表达式的底层原理是通过生成一个匿名类来实现。该类会重载函数调用运算符(),并包含Lambda表达式的函数体。Lambda表达式中捕获的外部变量会以成员变量的形式存储在该类中。当Lambda表达式被调用时,实际上是调用了该类的重载函数调用运算符()。 Lambda表达式可以与std::function结合使用,以实现函数对象的灵活使用。也可以将Lambda表达式赋值给相同类型的函数指针,实现函数指针的使用。但一般不建议这样使用,因为Lambda表达式已经提供了更加方便和简洁的方式。 总结来说,C++ Lambda表达式是一种用于定义匿名函数的语法,可以捕获外部变量并进行处理。其底层通过生成一个匿名类来实现,并提供了与std::function和函数指针的结合使用方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++11:lambda表达式](https://blog.csdn.net/zhang_si_hang/article/details/127117260)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机小混子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值