最近看到很多关于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. windows共享文件夹给centOS

    服务器使用的是CentOS系统,而本机使用的win7系统.考虑到是临时使用,所以就不打算搭建FTP和Samba服务器,直接通过CentOS挂载windows共享文件夹的方式来达到此目的. 既然是使用w ...

  2. iOS - 逆向 - Objective-C代码混淆 -confuse.sh文件写法

    class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄. 所以,我们迫切的希望混淆自己的代码. 混淆的常规思路 混淆分许多 ...

  3. ios - UINavigationBar添加背景图片的几种简单思路

    UITabBarController下面常常需要为多个ViewController设置导航栏样式,总结了一下遇到过的为UINavigationBar添加背景图片的几种简单思路 以设置背景图片为例: 第 ...

  4. 从设计到实现,一步步教你实现Android-Universal-ImageLoader-缓存

    转载请标明出处,本文出自:chaossss的博客 Android-Universal-ImageLoader Github 地址 Cache 我们要对图片进行缓存.有两种方式:内存缓存和本地缓存. 这 ...

  5. ionic + cordova 环境搭建

    1.安装nodejs:官网下载安装包,双击安装即可.成功后在控制台输入node -v 显示版本号即成功. 2.安装Java,配置环境变量,下载安卓sdk ,配置环境变量 ANDROID_HOME 为s ...

  6. 第二篇:尽可能使用 const

    前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. ...

  7. 2014江西理工大学C语言程序设计竞赛高级组题解

    1001 Beautiful Palindrome Number 枚举回文数字前半部分,然后判断该数字是否满足,复杂度为O(sqrt(n))! 1002 Recovery Sequence  本题的核 ...

  8. MySQL多实例启动停止

    原文地址:http://wolfword.blog.51cto.com/4892126/1241304/ 说明:本实验以MySQL 5.1为例来实验. 1.安装MySQL 5.1 yum instal ...

  9. 使用jquery的ajax方法获取下拉列表值

    AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新,用户体验非常好. ...

  10. window 注册表上下文菜单如何配置?

    注册表结构? Keys Abbreviation Description 描述 HKEY_CLASSES_ROOT HKCR Stores file association and COM objec ...