积少成多

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

构造一个闭包:一个能在作用域内捕捉变量 的匿名函数对象。

语法

[capture](params) mutable exception attribute -> ret{body},完整的声明

[capture](params) -> ret {body},一个常lambda声明:按副本捕捉的对象不能被修改

[capture](params){body},省略后缀返回值类型:

  闭包的operator()的返回值类型是根据一下规则推到的:

    如果body仅含有单一的return语句,那么返回值类型是返回表达式的类型(隐式转换之后的类型:右值到左值、数组到指针、函数到指针)

    否则,返回类型是void

[capture]{body}

  省略参数列表:函数没有参数,即参数是()

====================

mutable--允许body修改传值进来的形参,以及调用他们的非const成员函数

exception--提供闭包类型的operator()成员函数的异常说明或noexcept语句

attribute--提供闭包类型的operator()成员函数的属性说明

capture--指定哪些在函数声明处的作用域可见到的符号 将在函数体内可见

  符号表可按如下规则传入:

    [a,&b]按值捕获a,并按引用捕获b

    [this] 按值捕获了this指针

    [&] 按引用 捕获 lambda表达式所在函数的函数体中  所有的外部变量

    [=] 按值 捕获在lambda表达式所在函数的函数体中提及的   所有外部变量

    []什么也不捕获

params--参数列表,与命名函数一样

ret--返回值类型,如果不存在,由该函数return语句来隐式决定(或void,当它不凡会任何值的时候)

body--函数体

=================

来自http://my.oschina.net/wangxuanyihaha/blog/18315

lambda表达式用于创建并定义匿名的函数对象,来简化编程工作。

简化的语法可以看作,

[函数对象参数] (操作符重载函数参数) ->返回值类型 {函数体}

vector<int> iv{5, 4, 3, 2, 1};
int a = 2, b = 1;

for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x + b)<<endl;}); // (1)

for_each(iv.begin(), iv.end(), [=](int &x){x *= (a + b);});        // (2)

for_each(iv.begin(), iv.end(), [=](int &x)->int{return x * (a + b);});// (3)
  • []内的参数指的是lambda表达式可以取得的全局变量,1函数中的b就是指函数可以得到lambda表达式外的全局变量,如果在[]中传入=的话,就是可以取得所有的外部变量,如果2和3中的lambda表达式
  • ()内的参数每次调用函数时传入的参数
  • ->后加上的是lambda表达式返回值的类型,如3返回了int类型的变量。

 

posted on 2016-05-31 15:46  x7b5g  阅读(247)  评论(0编辑  收藏  举报