C++11 lambda表达式
2016-03-09 21:18
218 查看
http://blog.jobbole.com/44015//article/1940173.htmlC++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下: [capture](parameters)->return-type{body}
[](int x, int y) -> int { int z = x + y; return z; } 或 [](int x, int y){ int z = x + y; return z; }1.Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内. 这个机制允许这些变量被按值或按引用捕获.
[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的. [x, &y] //x 按值捕获, y 按引用捕获. [&] //用到的任何外部变量都隐式按引用捕获 [=] //用到的任何外部变量都隐式按值捕获 [&, x] //x显式地按值捕获. 其它变量按引用捕获 [=, &z] //z按引用捕获. 其它变量按值捕获
std::vector<int> some_list; int total = 0; for (int i=0;i<5;++i) some_list.push_back(i); std::for_each(begin(some_list), end(some_list), [&total](int x) { total += x; });
2.lambda函数是一个依赖于实现的函数对象类型,这个类型的名字只有编译器知道. 如果用户想把lambda函数做为一个参数来传递, 那么形参的类型必须是模板类型或者必须能创建一个std::function类似的对象去捕获lambda函数.使用 auto关键字可以帮助存储lambda函数
auto my_lambda_func = [&](int x) { /*...*/ };auto my_onheap_lambda_func = new auto([=](int x) { /*...*/ });
一个没有指定任何捕获的lambda函数,可以显式转换成一个具有相同声明形式函数指针.所以,像下面这样做是合法的:
auto a_lambda_func = [](int x) { /*...*/ };void(*func_ptr)(int) = a_lambda_func;func_ptr(4); //calls the lambda.
相关文章推荐
- c++多线程编程(三)
- c++多线程编程(二)
- c++多线程编程(一)
- C++中友元函数
- c++11 可变参数模板
- C语言实现C++面向对象语言多态特性
- 第2周项目1
- c语言 谭浩强 一维数组内放10个学生成绩 全局变量写一个函数 最高分、最低分、平均分
- C++多态
- C语言之位运算
- C/C++面试题
- 两个栈实现队列
- C++ 与 Java 之中的虚函数、抽象函数、抽象类、接口 比较
- 面试中的C++常见问题
- C语言知识总结
- C++_Eigen函数库用法笔记——The Array class and Coefficient-wise operations
- C语言高效编程
- 程序设计C++启程
- Protocol Buffer技术详解(C++实例)
- C++_Eigen函数库用法笔记——Block Operations