c++11标准:匿名函数(匿名表达式)lambda
2017-12-27 15:31
281 查看
c++11标准:匿名函数(匿名表达式)lambda
lambda:C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下:
匿名函数定义/匿名表达式声明:[capture](parameters)->return-type{body}
函数调用:function a = [capture](parameters)->return-type{body};
a(parameters);
parameters:形参
和函数一样
如果没有参数,空的圆括号()可以省略.
返回值也可以省略,如果函数体只由一条return语句组成或返回类型为void的话.形如:
[capture](parameters){body}
返回值类型可以通过以下算法推演出来
如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
如果没有 return 语句,则类似 void f(...) 函数。
例如:
[](int x, int y) { return x + y; } // 隐式返回类型 [](int& x) { ++x; } // 没有return语句 -> lambda 函数的返回类型是'void' []() { ++global_x; } // 没有参数,仅访问某个全局变量 []{ ++global_x; } // 与上一个相同,省略了()
[]:外部闭包
Lambda函数可以引用在它之外声明的变量.
这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内.
闭包可以按值、引用捕获:
例如:
[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的. [x, &y] //x 按值捕获, y 按引用捕获. [&] //用到的任何外部变量都隐式按引用捕获 [=] //用到的任何外部变量都隐式按值捕获 [&, x] //x显式地按值捕获. 其它变量按引用捕获 [=, &z] //z按引用捕获. 其它变量按值捕获
对this的捕获:只可以是值捕获,
在类成员中的lamda函数:
对protect和priviate成员来说, 这个lambda函数与创建它的成员函数有相同的访问控制.
访问this的成员不必使用this->语法,可以直接访问.
注意:如果一个闭包含有局部变量(类和局部)的引用,在超出创建它的作用域之外的地方被调用的话,这种行为是未定义的!
lambda函数是一个依赖于实现的函数对象类型,这个类型的名字只有编译器知道.
如果用户想把lambda函数做为一个参数来传递, 那么形参的类型必须是模板类型或者必须能创建一个std::function类似的对象去捕获lambda函数.
使用 auto关键字可以帮助存储lambda函数,
相关文章推荐
- c++11标准:匿名函数(匿名表达式)lambda
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析(三)
- 匿名函数:Lambda表达式和匿名方法
- C++11:匿名函数(lambda函数/表达式)及其用法
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一)
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)
- jdk8新特性:Lambda表达式(也称为闭包、可传递的匿名函数)与函数式接口@FunctionalInterface
- C++11新特性:Lambda函数(匿名函数)
- C++11 新特性之Lambda表达式
- C++11闭包函数:Lambda表达式的使用λ
- C++11标准 STL正则表达式 验证电子邮件地址
- C++11中的匿名函数(lambda函数,lambda表达式)
- 匿名函数、委托、lambda表达式、扩展方法
- 我的python学习之路--列表表达式及匿名函数lambda
- 匿名方法,Lambda表达式,高阶函数
- 结合C++11新特性来学习C++中lambda表达式的用法
- C++11 lambda 表达式解析
- C#中的Lambda 表达式 => 和匿名表达式 var