栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ Lambda 表达式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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; };
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/994579.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号