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. 联想G510安装win7系统

    1.插入系统盘重启(要按Fn+f12) 2默认下一步 3.选择自定义 4.选择需要将系统安装到的分区,格式化,然后下一步 5.默认下一步 安装到这里就成功了 6.问题处理: 第4步时出现 Window ...

  2. 关于json.stringify的注意事项

    今天通过navigator.getCurrentPosition中的success回调,用json.stringify打印postion时,怎么打印都只是一个{}, 而打印postion.coords ...

  3. 20165315 C语言学习情况与Java学习目标

    20165315 C语言学习情况与Java学习目标 一.出色技能的获取经验 我从小便是一个中规中矩的人,在很多方面都是让成绩尽量保持在前百分之二十到三十这个范围内,比如我比较擅长的唱歌和乒乓球,但也不 ...

  4. js验证前后密码是否一致,为什么当我输入不一致密码时,不会弹出警告啊

    <form name="form" action="#"><input type="password" id=" ...

  5. String 练习

    package com.hanqi; import java.util.Random; public class Text { public static void main(String[] arg ...

  6. laravel 服务提供者介绍和使用

    #安装传送门 安装composer,以及通过composer安装laravel #讲解使用 服务提供者这个具体表现都是围绕着依赖注入 在根目录config/app.php的providers中的数组中 ...

  7. imaplib.error: command: SEARCH => got more than 10000 bytes

    imaplib.error: command: SEARCH => got more than 10000 bytes 使用IMAPLIB进行标记邮件状态的时候,在 typ,data=M.sea ...

  8. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

    #6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. C#在Winform程序中显示QQ在线状态

    首先,引入必要的命名空间 using System.Windows.Forms;  using System.Net; 其次,在Form中拖入一个PictureBox控件,并设置其SizeMode为A ...

  10. robot framework测试驱动无法定位页面元素

    robot framework错误提示: [ WARN ] Keyword 'Capture Page Screenshot' could not be run on failure: NoSuchW ...