匿名函数(lambda)详解 C++

news/2024/7/16 4:40:16

匿名函数是许多编程语言都支持的概念,有函数体,没有函数名,c++引入了lambda 函数,你可以在你的源码中内联一个lambda函数,这就使得创建快速的,一次性的函数变得简单了。

 

 

#include <algorithm>

#include <cmath>

void abssort(float* x, unsigned N) {

    std::sort(x, x + N,

        // Lambda expression begins

        [](float a, float b) {

            return std::abs(a) < std::abs(b);} ) }    

 

lambda函数形式

 

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

 

[capture](parameters)->return-type{body}

捕捉块(catpure block): 指定如何捕捉所在作用域中的变量,并供给lambda主体使用。

参数(parameter): (可选)lambda表达式使用的参数列表。只有在不使用任何参数,并且没有自定mutable、一个exception_specification 和一个return_type的情况下可以忽略该列表,返回类型在某些情况下也是可以忽略的,详见对return_type的说明:eg: [] {return 10;}

参数列表和普通函数的参数列表类似,区别如下:

参数不能有默认值。

不允许变长参数列表。

不允许未命名的参数。

mutable:(可选)如果所在作用域的变量是通过值捕捉到,那么lambda表达式主体中可以使用这些变量的副本。这些副本默认标记为const,因此lambda表达式的主体不能修改这些副本的值。如果lambda表达式标记为mutable,那么这些副本则不是const,因此主体可以修改这些本地副本。

exception_specification:(可选)用于指定lambda可以抛出的异常。

return_type:(可选)返回值的类型。如果忽略了return_type,那么编译器会根据以下原则判断返回类型:

如果lambda表达式主体的形式为{return expression;}那么表达式return_type的类型为expression的类型。

其他情况下的return_type为void。

下面的例子演示了如何创建一个lambda表达式并立即执行这个表达式。这行代码定义了一个没有返回值也没有任何参数的lambda表达式。

 

 

 

lambda函数能够捕获lambda函数外的具有自动存储时期的变量。函数体与这些变量的集合合起来叫闭包。

  • [] 不截取任何变量
  • [&} 截取外部作用域中所有变量,并作为引用在函数体中使用
  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
  • [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
  • [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
  • [x, &y] x按值传递,y按引用传递
  • [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

http://www.niftyadmin.cn/n/2223669.html

相关文章

Error Code: 1054. Unknown column 'xxx' in 'field list'

这是一个最常见最基础的错误&#xff0c;就是字面意思&#xff0c;缺少xxx字段。 但是我直接从mysql表里复制的insert 执行语句&#xff0c;怎么可能会少字段呢&#xff1f; 本人也是这样认为的&#xff0c;为了这个小问题折腾了一个多小时。 问题的根本原因是你的基础表还有…

获取设备管理器的信息

有些时候需要先获取设备管理器里面的硬件信息&#xff0c;才能执行对应的操作&#xff0c;简单的鼓捣了一下&#xff0c;贴出来共享。 具体有两个方法&#xff0c;大致来说差不多&#xff0c;流程一样 &#xff0c;懒得整理了&#xff0c;直接贴出来原始体。 // PrintDeviceInf…

zookeeper应用场景练习(分布式锁)

在寻常的高并发的程序中。为了保证数据的一致性。因此都会用到锁。来对当前的线程进行锁定。在单机操作中。非常好做到&#xff0c;比方能够採用Synchronized、Lock或者其它的读写多来锁定当前的线程。可是在分布式的系统中&#xff0c;就非常难做到这一点。因此能够採用zookee…

git客户端出现libpng warning: iCCP: known incorrect sRGB profile

在关闭gitk窗口的时候&#xff0c;会出现一系列的 libpng warning: iCCP: known incorrect sRGB profile libpng warning: iCCP: known incorrect sRGB profile libpng warning: iCCP: cHRM chunk does not match sRGB libpng warning: iCCP: known incorrect sRGB profile li…

DDD领域驱动设计基本理论知识总结

领域驱动设计之领域模型 加一个导航&#xff0c;关于如何设计聚合的详细思考&#xff0c;见这篇文章。 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software &#xff08;领域驱动设计&#xff09;&#xff0c;简称Evans DDD。领域驱动…

打造独立数据库访问的中间服务

随着公司业务的不断变化&#xff0c;几年前的 A 项目和底层 DB_A 数据库华丽转身为核心业务服务和核心数据库。 想从 DB_A 数据库获取数据的 web 服务越来越多&#xff0c;项目之间的关系逐渐演变为下面这样&#xff1a; 很容易看出来按上图这样的发展趋势会存在很多问题&…

C# 不用实体类获取json数据

RootObject twoList JsonConvert.DeserializeObject<RootObject>(_res); var _vQcode twoList.result.questions.ToString(); //json格式中&#xff0c;按问卷分为多个节点&#xff0c;问卷是动态返回的&#xff0c;无法用实体类去装载 //目前确认是count1&#xff0c;…

学习java虚拟机--类文件结构

好枯燥啊&#xff0c;给自己点鼓励吧。。这个帐以后补补补转载于:https://blog.51cto.com/flybluesky/1941705