lambda表达式(c++11)
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就不能使用引用捕获)。为什么需要引用捕获?因为有些局部变量不能被拷贝:
2.3隐式捕获
=告诉编译器使用值捕获,&告诉编译器使用引用捕获:
也可以混合使用隐式捕获和显示捕获,此时捕获列表中第一个位置必须是隐式捕获。
3.可变lambda
1)对于值捕获:默认情况下,lambda不会改变其值,但是如果希望改变,则需要在参数列表后面加上关键字mutable:
2)对于引用捕获:如果是const变量的引用,则不能改变它;如果是非const变量的引用,则可以改变
4.指定lambda的返回类型
函数体有单一的return语句,我们无须指定返回类型,但是遇上显式的if/else条件判断有多个return语句的时候,就必须指定了:
5.标准库函数对象(非c++11)
可以使用标准库定义的一些函数对象来充当泛型算法的谓词:
标准库定义的这些函数对象对指针同样适用(正常方法去比较两个不相关的指针是错误的):
在这里,是想要通过比较指针的它自己的地址来排序这个存有指针的vector。
lambda表达式(c++11)的更多相关文章
- C++ 11 Lambda表达式、auto、function、bind、final、override
接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关 ...
- C++11 中function和bind以及lambda 表达式的用法
关于std::function 的用法: 其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...
- C++11 Lambda表达式简单解析
C++11 新增了非常多特性,lambda 表达式是当中之中的一个.假设你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 非常多语言都提供了 la ...
- 「C++11」Lambda 表达式
维基百科上面对于 lambda 的引入是如下描述的: 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find.用户经常希望能够在算法函数调用的附近定义一个临时的述部函数( ...
- C++11之lambda表达式
lambda表达式源于函数式编程的概念,它可以就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.lambda表达式的类型在C++11中被称为"闭包类型",也可以 ...
- C++11新特性 lambda表达式
C++11 添加了了一个名为lambda表达式的功能,可以用于添加匿名函数 语法: [capture_block](parameter) mutable exception_specification ...
- c++11 新特性之lambda表达式
写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input paramete ...
- C++11中的Lambda表达式
原文地址:C++中的Lambda表达式 作者:果冻想 一直都在提醒自己,我是搞C++的:但是当C++11出来这么长时间了,我却没有跟着队伍走,发现很对不起自己的身份,也还好,发现自己也有段时间没有写C ...
- C++11新特性(3) lambda表达式(1)
C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解. lambda表达式包括下面部分. [capture_block] ...
随机推荐
- nSamplesPerSec和nAvgBytesPerSec
nAvgBytesPerSec 意思是每秒多少字节,你的每个sample位深(精度/bitpersample)是16bit,就是2字节,nSamplesPerSec一秒44100个sample(441 ...
- centos7下的FastDFS5.09的安装与使用
FastDFS是一款开源的轻量级分布式文件系统,纯C实现,支持Linux.FreeBSD等Unix系统. 类google FS,不是通用的文件系统,只能通过专有API访问. FastDFS服务端有两种 ...
- JFinal上传文件时用getFile()方法报错
原因是缺少cos.jar包,补上即可.
- MSDos
一.简介 二.源码 http://www.computerhistory.org/atchm/microsoft-research-license-agreement-msdos-v1-1-v2- ...
- Oracle_PL/SQL(8) 动态sql
动态sql0.pl/sql块的限制 不能执行ddl操作(create.drop.alter): 不能执行部分dcl操作(grant.revoke). 1.语法动态sql:在执行时才能确定要执行的sql ...
- 解决sublime3不能编辑插件default settings的问题
一.遇见问题 今天给sublime安装了View In Browser,想更改一下默认启动的浏览器 preferences-Package settings-View In Browser-setti ...
- SSH原理与运用(一):远程登录(转)
作者: 阮一峰 日期: 2011年12月21日 SSH是每一台Linux电脑的标准配置. 随着Linux设备从电脑逐渐扩展到手机.外设和家用电器,SSH的使用范围也越来越广.不仅程序员离不开它,很 ...
- iOS.PrototypeTools
1. iPhone/iPad 原型工具 http://giveabrief.com/ 2. proto.io https://proto.io/ 3. Origami http://facebook. ...
- 卸载服务器GitLab
sudo gitlab-ctl uninstall sudo rpm -e gitlab-ce find / -name gitlab|xargs rm -rf
- [Python] Python教程
http://www.runoob.com/python/python-tutorial.html