lambda函数

C++lambda表达式

匿名函数

C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象

基本格式

caputrueopt->ret{body;};

[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}

比如说 {cout << “hello” << endl; };
对于匿名函数,一般用于传函数参数,当然也可以直接定义调用.

1
2
auto pfun=[](){cout<<"hello world"<<endl;}		//这里使用auto自动判断类型  其实是函数指针
pfun(); //调用这个函数

各个部分说明

函数对象参数(不可省略)

[] 不截取任何变量
[&] 截取外部作用域中所有变量,并作为引用在函数体中使用
[=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
[=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
[bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
[this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

重载参数列表

调用的时候需要传递的参数

返回类型(可以自动推导 可以省略)

auto fun = [](int x, int y)->int {cout << x + y << endl; return y;};
对于这里的->int 这个int就是返回值类型,如果有返回值类型需要在前面加上->
直接省略写成这种格式也可以[](int x,int y){cout<<x+y<<endl;return y;}

函数体

lambda表达式的函数体中可以和普通函数一样写,可以使用捕获的参数,写这个函数实现的具体步骤.

函数选项opt (可以省略)

可以填mutable,exception,attribute
mutable 表示函数体可以修改捕获变量的,同时可以访问捕获对象的非常属性成员函数
exception说明lambda表达式是否抛出异常以及何种异常
attribute用来声明属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;
int main()
{
auto ptr = []() {cout << "hello" << endl; }; //lambda表达式
ptr();//调用函数

auto fun = [](int x, int y)->int {cout << x + y << endl; return y;}; //带参数的lambda表达式
// 这里的->后面写的是返回值类型
auto z=fun(3, 4);
cout << z << endl;

cin.get();
return 0;
}