最近看到很多关于C++11的文档,有些是我不怎么用到,所以就略过去了,但是lambda表达式还是比较常用的,其实最开始学习python的时候就觉得lambda这个比较高级,为什么C++这么弱。果然C++增加这个东西。

语法

[ capture ] ( params ) mutable exception attribute -> ret { body }      (1)

[ capture ] ( params ) -> ret { body }                                              (2)

[ capture ] ( params ) { body }                                                       (3)

[ capture ] { body }                                                                       (4)

解释

capture     -     指定哪些在函数声明处的作用域中可见的符号将在函数体内可见。
                      符号表可按如下规则传入:

[=,&b],按引用捕获b,其他局部变量都按值捕获
              [this],按值捕获了this指针
              [&] 按引用捕获在lambda表达式所在函数的函数体中提及的全部自动储存持续性变量
              [=] 按值捕获在lambda表达式所在函数的函数体中提及的全部自动储存持续性变量
              [] 什么也没有捕获

params     -     参数列表,与命名函数一样
ret     -     返回值类型。如果不存在,它由该函数的return语句来隐式决定(或者是void,例如当它不返回任何值的时候)
body     -     函数体

例子

/*[] 什么也没有捕获*/
auto x = [](){cout<<"Lambda is woring"<<endl;};
x();
 /*[=] 按值捕获*/
int n=;
int m=;;
string s="many";
auto a= [n](string &s) mutable {n++;return s.size()>n;} ;
a(s);
cout<<n<<endl; //n=3 auto d = [m](string &s) mutable {m++;n++; return s.size()>m;};
cout<<"m="<<m<<", n="<<n<<endl; //error, n没有捕获

这个地方不知道为什么必须用mutable,不然编译不过。可能是值捕获的关系吧。

/*[&] 按引用捕获*/
int n=;
string s="many";
auto b= [&n](string &s) {n++;return s.size()>n;};
b(s);
cout<<n<<endl; //n=4
/*[=, &foo] 除了foo引用捕获,其他局部变量全部值捕获*/
int n=;
int m=;
string s="many";
auto c = [=,&n](string &s) mutable {m++;n++; return s.size()>m;};
c(s);
cout<<"m="<<m<<", n="<<n<<endl; //m=4,n=4
/*[this],按值捕获了this指针 */
class A
{
private:
int z;
public:
A(){z=;}
void fun(int m)
{
auto a = [this](int m) {return this->z+m;};
cout<<a(m)<<endl;
}
}; int main ()
{
A *a =new A();
a->fun(); //5
return ;
}

                      

C++11 里lambda表达式的学习的更多相关文章

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

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

  2. C++11之lambda表达式

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

  3. 【C++11】 lambda表达式

    i.e.int x = 10;int y = 20;int z = [&]{ x = x * x; y = y * y; return x + y;}(); 上面z后面以[]开头的为一个lam ...

  4. 【Java】Java8新增的Lambda表达式_学习笔记

    一.Lambda表达式可以简化创建匿名内部类对象 1.不需要new XXX(){}这种繁琐代码. 2.不需要指出重写的方法名. 3.不要给出重写的方法的返回值类型. 4.Lambda相当于一个匿名方法 ...

  5. Spring8中lambda表达式的学习(Function接口、BiFunction接口、Consumer接口)

    代码重构,为了确保功能的等效性,梳理代码时,发现如下代码: public SingleRespTTO fundI(SingleReqTTO request) throws Exception { re ...

  6. C++11之lambda表达式应用

    应用 foreach语句中 #include <time.h> #include <algorithm> using namespace std; void func(int ...

  7. C++11之lambda表达式解析

    什么是Lanmbda? 简短函数,就地书写.常用于向函数(算法)传递函数参数. 语法 Lambda 表达式,[capture](paras)mutable->return type{statem ...

  8. c++11:lambda表达式的使用

    lambda表达式的一般形式: [capture list] (parameter list) -> return type{function body}; 其中,capture list (捕 ...

  9. lambda表达式的学习

    Lambda表达式 为什么使用lambda表达式 Lambda表达式可以简化我们的代码,使我们只需要关注主要的代码就可以. //测试用的实体类 public class Employee { priv ...

随机推荐

  1. iOS 创建多个button实现点击改变背景颜色

    工程中需要实现与UISegmentedControl效果相似的一排一共十个button,如下图.但是SegmentedControl修改不太方便,就用button替代, 循环创建十个button,点击 ...

  2. day11函数的进阶动态参数,命名空间,作用域,第一类对象

    一.习题收藏 5.写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数,并返回结果. # def func4(s): # dic = { # 'num':0,'alpha':0, ...

  3. docker搭建lnmp环境(问题,资料,命令)

    入门参考 http://www.runoob.com/docker/docker-install-nginx.html 十大常用命令玩转docker 1. #从官网拉取镜像 docker pull & ...

  4. Servlet注解

    在Servle2.5能够使用注解 在web.xml的<web-app>标签下有一属性metadata-complete="true"在设置true时,Servlet中的 ...

  5. Nginx 的多站点配置

    当我们有了一个 VPS 主机以后,为了不浪费 VPS 的强大资源(相比共享主机1000多个站点挤在一台机器上),往往有想让 VPS 做点什么的想法,银子不能白花啊:).放置多个网站或者博客是个不错的想 ...

  6. SpringBoot-------实现多数据源Demo

    之前SpringBoot出来时候就看了下Springboot,感觉的确精简掉了配置文件! 还是很方便的!没办法,我只是个菜鸟! 什么怎么启动Springboot什么的就不说了, 具体的Demo地址我都 ...

  7. 【转】IBM PowerVM虚拟化技术笔记

    1. 从CPU虚拟化的角度, 分区(partition)可以分成两大类:Micro-partition和Dedicated-procesor.前者可以将物理处理器以0.01的 粒度分配给微分区,分区创 ...

  8. SQLServer中行列转换Pivot UnPivot

    PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P ...

  9. CentOS 7.4 防火墙&网卡设置

    防火墙 查看防火墙状态 临时关闭防火墙 (关闭的是当前正在运行的防火墙,重启时还是会自启) 彻底关闭防火墙 (开机不会再自启) 开启防火墙 查看防火墙状态 网卡 查看网卡状态

  10. DOM 属性操作

    1 属性节点 2 attribute操作 3 value获取值操作 4 class的操作 5 指定CSS操作 1.属性节点 //获取文本节点的值 var divEle = document.getEl ...