C++ Lambda表达式的常见用法

Lambda表达式

构造一个闭包:一个能够捕获作用域中变量的未命名函数对象。

在操作上,闭包是将函数与环境一起存储的记录。

  1. capture 子句(在 C++ 规范中也称为 lambda 引入器。)
  2. 参数列表自选。(也称为 lambda 声明符)
  3. 可变规范自选。
  4. 异常规范自选。
  5. 尾随返回类型自选。
  6. λ体。

3 书写表达式

  • [] – 不捕捉任何变量
  • [&] – 捕获外部作用域中所有变量,并作为引用在函数体内使用 (按引用捕
    获)
  • [=] – 捕获外部作用域中所有变量(依赖于编译器,只能捕获不被优化的变量),并作为副本在函数体内使用 (按值捕获)
    注:拷贝的副本在匿名函数体内部为const类型.
  • [=, &foo] – 按值捕获外部作用域中所有变量,并按照引用捕获外部变量 foo
  • [bar] – 按值捕获 bar 变量,同时不捕获其他变量
  • [&bar] – 按引用捕获 bar 变量,同时不捕获其他变量
  • [this] – 捕获当前类中的 this 指针
  • 让 lambda 表达式拥有和当前类成员函数同样的访问权限
    如果已经使用了 & 或者 =, 默认添加此选项

3.2 使用的场景

用到函数指针的地方,应该考虑一下这个地方需不需要写Lambada表达式。

类中定义了只使用一次的方法,可以考虑是否需要用到Lambada表达式。

只需要使用一次

类中进行调用。

好处:

  • 简化代码: 维护代码完整性
  • 捕获列表 简化代码解耦。

具体的例子

01、代码维护上

Lambada类似于函数指针的东西,比如sort函数 自定义排序.

auto compare = [](int a, int b)
{
	return a > b;
};
  • 1
  • 2
  • 3
  • 4

02、代码解耦

如果某天多了一个条件,那么普通的函数参数列表要跟着改变,但是可以使用用匿名函数进行解耦。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《C++ Lambda表达式的常见用法》
文章链接:https://zhuji.vsping.com/4467.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。