C++新特性学习笔记--Lambda表达式

前言

  Lambda表达式其实从C++11就引入了,最近开始学习新特性才第一次看到却不认识十分惭愧。看了一下大家的博客分享大多是数年前写成的,没有包含C++20、17乃至14的一些新特性。故参照手册并参考了两篇较老但是写的比较清楚的博客从头写一篇学习笔记自勉,部分内容参考链接在文末放出。

Lambda表达式的作用

  构造闭包:能够捕获作用域中的变量的无名函数对象。简单来说lambda表达式就是匿名函数,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,有好的可读性和可维护性。

语法

[捕获] <模板形参>(可选)(c++20) ( 形参 ) 说明符(可选) 异常说明 attr -> ret requires(可选)(c++20) { 函数体 }	

捕获

  []是Lambda引出符。编译器根据该引出符判断接下来的代码是否是Lambda函数。捕获 是零或更多捕获符的逗号分隔列表,可选地以 默认捕获符 开始。仅有的默认捕获符是
&(以引用隐式捕获被使用的自动变量)和 = (以复制隐式捕获被使用的自动变量)。
  当出现任一默认捕获符时,都能隐式捕获当前对象(*this)。当它被隐式捕获时,始终被以引用捕获,即使默认捕获符是 = 也是如此当默认捕获符为 = 时,*this 的隐式捕获被弃用。 (C++20 起)
捕获 中单独的捕获符的语法是

标识符              //简单以复制捕获
标识符 ...	       //作为包展开的简单以复制捕获
标识符 初始化器	   //(C++14 起)带初始化器的以复制捕获
& 标识符	           //简单以引用捕获
& 标识符 ...	       //作为包展开的简单引用捕获
& 标识符 初始化器	   //(C++14 起)带初始化器的以引用捕获
this	           //当前对象的简单以引用捕获	
* this	           //(C++17 起)当前对象的简单以复制捕获
... 标识符 初始化器  //(C++20 起) 用作为包展开的初始化器以复制捕获
& ... 标识符 初始化器//(C++20 起)用作为包展开的初始化器以引用捕获
  • 当默认捕获符是 & 时,后继的简单捕获符必须不以 & 开始。
  • 当默认捕获符是 = 时,后继的简单捕获符必须以 & 开始,或者为 *this (C++17 起) 或 this (C++20 起)。
  • 任何捕获符只可以出现一次。

形参

()中为匿名函数的形参,可连带省略。

auto func1 = [](int i = 6) { return i + 4; };
std::cout << "func1: " << func1() << '\n';
  • 闭包的类型不能被指名,但可用 auto 提及
  • C++14 起,lambda 能拥有自身的默认实参

说明符

mutable:允许 函数体 修改各个复制捕获的对象,以及调用其非 const 成员函数。默认情况下,Lambda函数总是一个const函数。

constexpr:显式指定函数调用运算符为 constexpr 函数。此说明符不存在时,若函数调用运算符恰好满足针对 constexpr 函数的所有要求,则它也会是 constexpr(C++17 起)

consteval:指定函数调用运算符为立即函数。不能同时使用 consteval 和 constexpr。(C++20 起)

返回类型

->标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。

函数体

{函数体}。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。

与普通函数最大的区别是,除了可以使用参数以外,Lambda函数还可以通过捕获列表访问一些上下文中的数据。具体地,捕捉列表描述了上下文中哪些数据可以被Lambda使用

使用示例

std::vector<int> c = {1, 2, 3, 4, 5, 6, 7};
int x = 5;
c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; }), c.end());
 
std::cout << "c: ";
std::for_each(c.begin(), c.end(), [](int i){ std::cout << i << ' '; });
std::cout << '\n';
  • 输出
    c: 5 6 7

参考内容链接

C++中文参考手册Lambda 表达式 (C++11 起)
https://www.cnblogs.com/jimodetiantang/p/9016826.html
https://blog.csdn.net/fjzpdkf/article/details/50249287

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值