匿名函数(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指针。如果已经使用了&或者=就默认添加此选项。
#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指针。如果已经使用了&或者=就默认添加此选项。
相关文章推荐
- 匿名函数(lambda)详解 C++
- 【python】详解lambda匿名函数以及结合map、reduce、filter、sorted等使用
- 委托,事件,回调,匿名函数与Lambda表达式详解
- C++lambda详解~读书笔记
- C++lambda详解~读书笔记
- C++ Lambda 表达式使用详解
- Python 3 之 lambda匿名函数详解
- Lambda expression in C++ & Haskell || C++ 中的匿名函数 [EN/CN]
- C++ lambda 表达式详解
- C++lambda详解~读书笔记
- C++中的const的使用详解
- 详解volatile在C++中的作用
- C/C++中函数参数传递详解
- C++的static关键字 详解
- C++ 拷贝构造函数详解
- C++ 内存分配(new,operator new)详解
- C/C++中extern关键字详解
- C++ 算法之希尔排序详解及实例
- C++文件读写详解(ofstream,ifstream,fstream)
- c++ const 详解