lamda表达式-lamda-改变了c++语言游戏。这有点让人吃惊,毕竟它并未给这门语言带来新的令人印象深刻的表现力。lamda可以做的任何事情,你都可以用手多敲一些代码来完成。然而lamda在创建函数对象上的便捷性,一天又一天的对c++编程产生了巨大的影响。没有lamda时,使用c++的_if算法(std::find_if,std::remove_if,std::count_if)会很琐碎。而引入lamda之后,琐碎不复存在了。用户化的比较算法也类似(std::sort,std::lower_bound, std::nth_element)。在stl之外,lamda使得用户可以方便的为std::unique_ptr和std::shared_ptr自定义对象删除器。也使得多线程编程中,对条件变量的判断显得更为直接。除了标准库之外,lamda简化了回调函数,接口适配函数以及一次性的上下文函数调用。lamda使c++成为一门令人愉悦的语言。
lamda的词义会让你困惑,下面例子帮你简单理一理:
std::find_if(container.begin(),container.end(), [] (int val){return 0 <val && val < 10;});
闭包是lamda在运行时候创建的对象。根据捕获模式不同,闭包持有捕获数据的拷贝或者引用。
当调用std::findf时候,闭包是传递给函数的第三个参数。
闭包类是闭包实例化的类。每个lamda都促使编译器产生一个闭包类。而lamda的代码,将在其闭包类的成员函数中运行。
lamda创建的闭包,经常被用作函数对象参数。在上面std::find_if中正是如此。
然而闭包本身可以被复制,可能会出现一个闭包类型的多个闭包。下面代码:
{
int x; //局部变量
auto c1 = [x](int y) { return x*y > 55;}; c1是landa产生的闭包的一个拷贝
auto c2 = c1; // c2是c1的一个拷贝
auto c3 = c2; // c3 是c2的一个拷贝
}
c1,c2,c3都是lamda闭包的拷贝。
非正式的情况,不会区分闭包,闭包类以及landa。但在下面条款中,区分哪些在编译期间存在(lamda和闭包类),以及哪些在运行期间存在(闭包对象),并且弄清楚它们之间的联系是非常重要的。