1.概念

1)lambda表达式是一个可调用的代码单元,它由一个捕获列表、一个参数列表、一个箭头、一个返回类型、一个函数体组成:

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

3)忽略参数列表:参数列表可以忽略,捕获列表不可以忽略,也就是说“()”可以忽略,“[]”不可以忽略

4)忽略返回类型:

  • 忽略返回类型同时也会忽略那个箭头
  • 如果lambda表达式的函数体只是一个单一的return语句,则返回类型可从return的表达式的类型来推断
  • 如果lambda表达式的函数体除了单一的return语句还有别的内容,则默认返回void
  • 单一的return语句包括带有条件运算符"?"的return语句,但不包括带有 if/else 条件判断的return语句

5)底层实现原理:仿函数

2.捕获列表

1)捕获列表一般为空,可以存放局部变量,来指出lambda会使用这些局部变量

2.1值捕获

  对局部变量采取拷贝的方式进行捕获,需要注意的是,是在创建lambda时拷贝,而不是使用lambda时:

2.2引用捕获

  对局部变采取引用的方式进行捕获,此时必须保证被引用的对象在lambda执行时是存在的(函数返回lambda时,这个lambda就不能使用引用捕获)。为什么需要引用捕获?因为有些局部变量不能被拷贝:

  ostream对象不能被拷贝

2.3隐式捕获

  =告诉编译器使用值捕获,&告诉编译器使用引用捕获:

  也可以混合使用隐式捕获和显示捕获,此时捕获列表中第一个位置必须是隐式捕获。

3.可变lambda

1)对于值捕获:默认情况下,lambda不会改变其值,但是如果希望改变,则需要在参数列表后面加上关键字mutable:

2)对于引用捕获:如果是const变量的引用,则不能改变它;如果是非const变量的引用,则可以改变

4.指定lambda的返回类型

  函数体有单一的return语句,我们无须指定返回类型,但是遇上显式的if/else条件判断有多个return语句的时候,就必须指定了:

5.标准库函数对象(非c++11)

  可以使用标准库定义的一些函数对象来充当泛型算法的谓词:

标准库定义的这些函数对象对指针同样适用(正常方法去比较两个不相关的指针是错误的):

在这里,是想要通过比较指针的它自己的地址来排序这个存有指针的vector。

lambda表达式(c++11)的更多相关文章

  1. C++ 11 Lambda表达式、auto、function、bind、final、override

    接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关 ...

  2. C++11 中function和bind以及lambda 表达式的用法

    关于std::function 的用法:  其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...

  3. C++11 Lambda表达式简单解析

    C++11 新增了非常多特性,lambda 表达式是当中之中的一个.假设你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 非常多语言都提供了 la ...

  4. 「C++11」Lambda 表达式

    维基百科上面对于 lambda 的引入是如下描述的: 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find.用户经常希望能够在算法函数调用的附近定义一个临时的述部函数( ...

  5. C++11之lambda表达式

    lambda表达式源于函数式编程的概念,它可以就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.lambda表达式的类型在C++11中被称为"闭包类型",也可以 ...

  6. C++11新特性 lambda表达式

    C++11 添加了了一个名为lambda表达式的功能,可以用于添加匿名函数 语法: [capture_block](parameter) mutable exception_specification ...

  7. c++11 新特性之lambda表达式

    写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input paramete ...

  8. C++11中的Lambda表达式

    原文地址:C++中的Lambda表达式 作者:果冻想 一直都在提醒自己,我是搞C++的:但是当C++11出来这么长时间了,我却没有跟着队伍走,发现很对不起自己的身份,也还好,发现自己也有段时间没有写C ...

  9. C++11新特性(3) lambda表达式(1)

    C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解. lambda表达式包括下面部分. [capture_block] ...

随机推荐

  1. [剑指Offer]27-二叉树的镜像

    题目链接 https://www.nowcoder.com/practice/564f4c26aa584921bc75623e48ca3011?tpId=13&tqId=11171&t ...

  2. 项目总结14:Windows远程连接redis(cmd指令或PowerShell指令)

    1-确认远程的redis服务器是否允许被远程连接,已redis server安装在阿里云ECS上为例 1-1-确认在阿里云控制台,开放了端口6379和允许访问的IP 1-2-确认在服务器上安装redi ...

  3. 【校招面试 之 网络】第2题 TCP的可靠传输、流量控制、滑动窗口

    1.可靠传输 (1)三次握手 TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接: (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_S ...

  4. tomcat启动闪退之内存不足及显著优化

    增大内存: 打开catalina.bat,@echo off回车输入  set JAVA_OPTS=-server -Xms256m -Xmx512m -XX:PermSize=128M -XX:Ma ...

  5. Bootstrap(2) 排版样式

    1.页面主体,Bootstrap 将全局 font-size 设置为 14px,line-height 行高设置为 1.428(即20px):<p>段落元素被设置等于 1/2 行高(即 1 ...

  6. 26-算法训练 Torry的困惑(基本型) 素数打表

      算法训练 Torry的困惑(基本型)   时间限制:1.0s   内存限制:512.0MB      问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7……这样的数叫做质数.To ...

  7. MYSLQ数据库 day 1

    啥是SQL? 据库的组成部分,其中数据库管理系统可以接收一些命令,对数据文件进行添加.删除.修改.查询等操作.那么这些命令就是 SQL . SQL:(Structured Query Language ...

  8. 【Linux系列】Ubuntu ping通,xshell无法连接

    现象描述:Ubuntu能Ping通主机,主机也能ping通虚拟机.而且,虚拟机也能上网.只是xshell不能连接. 解决方案: 一:使用管理员身份 设置防火墙. 先查看一下防火墙状态 sudo ufw ...

  9. Python.Flask.0

    Resource List of Flask 1. 吐槽 Python Web 框架 Flask https://blog.tonyseek.com/post/discuss-about-flask- ...

  10. [Centos] ERROR: Could not find useradd in chroot, maybe the install failed?

    [mockbuild at localhost ~]$ mock -r centos-5-x86_64-testdev.cfg initinitcleanprepThis may take a whi ...