C++ Lambda 表达式

原文链接

参考链接

理解说明

[已经声明的成员](传参)->(return type){
函数实现
}

并且

auto 函数指针 = [已经声明的成员](传参)->(return type){
函数实现

这个可能难以理解

换个说明方式
首先声明一个函数指针

int CMP(int i)
{
	return (++i);
}
int(* f)(int) = CMP;
i = f(4);

这个时候值为i的值为5;
接下来换成lambad表达式

auto f = [=](int A)->int {return (++A) ; };
i = f(4);

这个时候i的值依旧为5
上面两个代码比较:两个f的作用为一样的,所以可以短暂的将lambad表达式理解为一个没有匿名函数,而f就是这个lambad表达式的函数指针

[]中括号中的捕获需要注意的事项

先引用一个图片
在这里插入图片描述
函数声明:

	static int z = 3;
	int i = 3;
	int j = 3;

	//捕获值为空,默认不捕获上方的成员变量,但z为静态成员,所以可以使用
	auto f = [](int A )->int {return A+ z; };
	//错误,i为成员函数,没有捕获所以不能使用
	auto f = [](int A)->int {return A + i; };
	//值捕获方式,所以可以使用
	auto f1 = [=](int A)->int {return j+i; };
	//引用捕获方式,j和i都可以使用
	auto f2 = [&](int A)->int {return j+i; };
	//错误,默认引用捕获,后方的i不能在使用引用捕获
	auto f3 = [&,&i](int A)->int {return (++A); };
	//j和i都是引用捕获
	auto f4 = [&j,&i](int A)->int {return (++A); };
	//默认值捕获,i采用引用捕获
	auto f5 = [=, &i](int A)->int {return (++A); };
	//错误,其余值引用捕获,只需要单独声明i,不需要在添加=
	auto f6 = [&, =i](int A)->int {return i+1; };
	//其余值引用捕获,只需要单独声明i,不需要在添加=
	auto f7 = [&, i](int A)->int {return i + 1; };
	//错误,默认为值捕获,所以不能添加=
	auto f8 = [=j, =i](int A)->int {return i + 1; };
	//默认为值捕获,所以不能添加=
	auto f9 = [j, i](int A)->int {return i + 1; };

参数列表

需要注意的是,lambad表达式中的参数不可以像普通函数一样省略声明,但可以设置缺省值

	int i = 3;
	int j = 3;
	//正确
	auto f = [&](int A)->int {return A + j; };
//错误 不认识A
	auto f1 = [&](int )->int {return A + j; };
//输出值为5 ,因此可以有缺省值
	auto f3 = [&](int A=2)->int {return A + j; };
	i = f3();
	auto f3 = [&](int A=2, int B = 4)->int {return A +B+ j; };
	i = f3(3);

返回值

正确

	auto f1 = [&](int A=2, int B = 4)->int {return A +B+ j; };

错误,没有返回值 应改为{return A + B + j; }

	auto f2 = [&](int A = 2, int B = 4)->int { A + B + j; };

正确,但无法使用 i=f3

	auto f3 = [&](int A = 2, int B = 4){ A + B + j; };

正确,隐藏->int 但使用时i=f4时没有问题

	auto f4 = [&](int A = 2, int B = 4) { return A + B + j; };

函数体

	static int z = 3;
	int i = 3;
	int j = 1;
	//对于静态成员,使用与普通函数一样
	auto f1 = [&]() { ++z; };
	auto f2 = [=]() { ++z; };
	auto f3 = [&]() { ++j; };
	//错误,值捕获,无法修改j,不能修改外部值
	//auto f4 = [=](){ ++j; };
	auto f5 = [&,j]() { i=j+1; };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值