C++11 lambda表达式(lambda expression)

1.可调用对象(callable object)类别包括:

  函数

  函数指针

  重载了函数调用运算符的类

  lambda 表达式

2.lambda表达式形式:

  [capture list] (parameter list) -> return type { function body }

  capture list (捕获列表)是一个 lambda 所在函数中定义的局部变量的列表(通常为空),空捕获列表表明此 lambda 不使用它所在的函数中的任何局部变量, return type、parameter list 和 function body 与任何普通函数一样,分别表示返回类型、函数列表和函数体,但是与普通函数不同,lambda 必须使用尾置返回来指定返回类型

  尾置返回类型跟在形参列表后面并以一个 -> 符号开头,为了表示函数真正的返回类型跟在形参列表之后,在本应该出现返回类型的地方放置了一个auto

    auto func(int i) -> int(*)[10]; // func接受一个 int 类型的实参,返回一个指针,该指针指向含有10个整数的数组

  lambda 可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体

    auto f = [ ] { return 42; };

  lambda 的调用方式与普通函数调用方式相同,都是使用调用运算符

    cout << f() << endl;

  lambda 中忽略括号和参数列表等价于指定一个空参数列表

  lambda 中忽略返回类型,可根据函数体中的代码推断出返回类型

3.  lambda 不能有默认参数

4.捕获列表

  以一对 [ ] 开始,可以在其中提供一个以逗号分隔的名字列表,这些名字都是 lambda 它所在函数中定义的

  捕获列表只用于局部非 static 变量, lambda 可以直接使用局部 static 变量和它所在函数之外声明的名字

  与参数传递类似,变量的捕获方式也可以是值或引用

  值捕获的前提是变量可以拷贝,与参数不同,被捕获的变量的值是在 lambda 创建时拷贝,而不是调用时拷贝

  lambda 捕获的都是局部变量,以引用方式捕获的变量与其他任何类型的引用的行为类似,采用引用方式捕获一个变量,就必须确保被引用的对象在 lambda 执行时候时存在的

  如果函数返回一个 lambda ,则与函数不能返回一个局部变量的引用类似,此 lambda 不能包含引用捕获

  尽量减少捕获数据量,避免捕获指针或引用

  隐式捕获: [ &, c] (const string &s) { os << s << c; } // os 是隐式捕获,引用捕获方式; c 是显式捕获,值捕获方式

  混合使用隐式捕获和显式捕获时,捕获列表中第一个元素必须是一个 & 或 = ,显式捕获的变量必须使用与隐式捕获不同的方式

  默认情况下,对于一个值拷贝的变量, lambda 不会改变其值,如果要改变一个被捕获变量的值,就必须在参数列表首加上关键字 mutable,就是 mutable 前面必须要有 ()

    auto f = [v] ( ) mutable { return ++v;}

  一个引用捕获的变量是否可修改历来与此引用指向的是一个 const 类型还是一个非 const 类型

5. C++14、C++17 lambda 新标准待总结

原文地址:https://www.cnblogs.com/SmallAndGreat/p/12147637.html

时间: 2024-10-08 09:15:41

C++11 lambda表达式(lambda expression)的相关文章

委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: public static string Add(string a, string b) { return string.Format("{0} #### {1}",a,b); } //实名委托方式 Function&

Lambda表达式 和 Expression&lt;T&gt;

经常用的Lambda表达式 返回的是  Expression<T> 格式 public class ActivityService { private readonly List<Activity> _source = new List<Activity>(); public ActivityService() { _source.Add(new Activity() { Id = "5656d551d430520e100fa4f5" , Name=

JAVA 8 Lambda表达式-Lambda Expressions

Lambda表达式介绍 Lambda表达式是在java规范提案JSR 335中定义的,Java 8 中引入了Lambda表达式,并被认为是Java 8最大的新特性,Lambda表达式促进了函数式编程,简化了Java编程开发. 背景知识 匿名内部类 在Java中,匿名内部类一般适用于那些在Java应用中只会出现一次的实现类,举个例子,在标准的Swing或JavaFX应用中,有很多键盘和鼠标的事件处理程序,一般情况下,你不需要写一个单独的事件处理类,而是使用如下方式(有Swing编程经验的应该很熟悉

java8之lambda表达式(lambda表达式语法)

到目前为止,在Java中向其他代码传递一段代码并不是很容易.你不可能将代码块到处传递.由于java是一个面向对象的语言,因此你不得不构建一个属于某个类的对象,由它的某个方法来包含所需的代码. lambda表达式帮我们解决了这个问题,可以直接传递代码块!Java中lambda表达式的格式:参数,箭头(->),以及一个表达式.示例: (String first,String second) -> Integer.compare(first.length(), second.length()) 如果

C++11中的Lambda表达式

本文地址:http://www.cnblogs.com/archimedes/p/c11-lambda.html,转载请注明源地址. “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.Lambda表达式可以表示闭包(注意和数学传统意义上的不同). ISO C++ 11 标准的一大亮点是引入Lambda表达式.基本语法如

C++11新特性——lambda表达式

C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,"Lambda表达式"或"匿名函数"这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等.今天,我们就来简单介绍一下C++中Lambda表达式的简单使用. 声明Lambda表达式 Lambda表达式完整的声明格式如下: [capture list] (params list) m

C++11 lambda表达式在for_each和transform算法下的使用

以前,在lambda表达式没有进入标准的时候,对容器的遍历等涉及到使用函数指针的情况,一般人会懒得使用std::for_each,或std::transform,也许只是一个短短的几句话,却要单独写个函数,或函数对象,写的代码反而不如自己用for循环来的快. 但是,C++11引入了lambda表达式后,一切都变的简单了! 1.lambda表达式 lambda表达式是一个匿名函数,用它可以非常方便的表示一个函数对象,先简单说一下lambda表达式,下面这张图表示了C++11中lambda表达式的写

C++11中的匿名函数 lambda函数 lambda表达式

这篇文章是根据维基百科整理来的,原文请看:http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下: [capture](parameters)->return-type{body} 如果没有参数,空的圆括号()可以省略.返回值也可以省略,如果函数体只由一条return语句组成或返回类型为void的话.形如:   [captur

C#中的Lambda表达式和表达式树

在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创