您的位置:首页 > 编程语言 > C语言/C++

匿名函数(lambda)详解 C++

2018-03-22 10:53 1121 查看
匿名函数是许多编程语言都支持的概念,有函数体,没有函数名,c++引入了lambda 函数,你可以在你的源码中内联一个lambda函数,这就使得创建快速的,一次性的函数变得简单了。

#include <algorithm>#include <cmath>void abssort(float* x, unsigned N) {    std::sort(x, x + N,        // Lambda expression begins        [](float a, float b) {            return std::abs(a) < std::abs(b);} ) }     lambda函数形式
[capture_block](parameters) mutable exception_specification->return_type{ body }  
捕捉块(catpure block): 指定如何捕捉所在作用域中的变量,并供给lambda主体使用。参数(parameter): (可选)lambda表达式使用的参数列表。只有在不使用任何参数,并且没有自定mutable、一个exception_specification 和一个return_type的情况下可以忽略该列表,返回类型在某些情况下也是可以忽略的,详见对return_type的说明:eg: [] {return 10;}参数列表和普通函数的参数列表类似,区别如下:参数不能有默认值。不允许变长参数列表。不允许未命名的参数。mutable:(可选)如果所在作用域的变量是通过值捕捉到,那么lambda表达式主体中可以使用这些变量的副本。这些副本默认标记为const,因此lambda表达式的主体不能修改这些副本的值。如果lambda表达式标记为mutable,那么这些副本则不是const,因此主体可以修改这些本地副本。exception_specification:(可选)用于指定lambda可以抛出的异常。return_type:(可选)返回值的类型。如果忽略了return_type,那么编译器会根据以下原则判断返回类型:如果lambda表达式主体的形式为{return expression;}那么表达式return_type的类型为expression的类型。其他情况下的return_type为void。下面的例子演示了如何创建一个lambda表达式并立即执行这个表达式。这行代码定义了一个没有返回值也没有任何参数的lambda表达式。lambda函数能够捕获lambda函数外的具有自动存储时期的变量。函数体与这些变量的集合合起来叫闭包。[] 不截取任何变量
[&} 截取外部作用域中所有变量,并作为引用在函数体中使用
[=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
[=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
[bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
[x, &y] x按值传递,y按引用传递
[this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: