5,Lambda

Lambda


https://blog.csdn.net/A1138474382/article/details/111149792

Lambda

请添加图片描述
捕获列表。在C ++规范中也称为Lambda导入器, 捕获列表总是出现在Lambda函数的开始处。实际上,[]是Lambda引出符。编译器根据该引出符判断接下来的代码是否是Lambda函数,捕获列表能够捕捉上下文中的变量以供Lambda函数使用。
参数列表。与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号“()”一起省略。
可变规格*。mutable修饰符, 默认情况下Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空)。*
异常说明。用于Lamdba表达式内部函数抛出异常。
返回类型。 追踪返回类型形式声明函数的返回类型。我们可以在不需要返回值的时候也可以连同符号”->”一起省略。此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导。
lambda函数体。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。

#include<iostream>
using namespace std;
int main()
{
	auto Hello = []()//创建函数
	{
		printf("Hello\n");

	};
	Hello();//打印函数//输出结果:Hello

	auto Hello2 = [](char*buff)
	{
		printf("%s inHello2\n",buff);
	};
	char buffer[1024] = "Hello2";
	Hello2(buffer);//输出结果:Hello2 inHello2

	auto Hello3 = [](char* buff3)
	{
		auto Hello4 = [](char* buff4)
		{
			printf("%s inHello3\n", buff4);
		};
		Hello4(buff3);
	};
	char buffer3[1024] = "Hello3";
	Hello3(buffer);//输出结果:Hello2 inHello3

	return 0;
}

在[]传入元素时编译器回自动在签面加上const,所以前面加上const才匹配
[]内如果是&代表上面的所有参数都可以用

[]表示不捕获任何变量
[var]表示值传递方式捕获变量var
[=]表示值传递方式捕获所有父作用域的变量(包括this)
[&var]表示引用传递捕捉变量var
[&]表示引用传递方式捕捉所有父作用域的变量(包括this)
[this]表示值传递方式捕捉当前的this指针

[=, &] 拷贝与引用混合
[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量。
[&,a,this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。
捕捉列表不允许变量重复传递。
[=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;
[&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。

#include<iostream>
using namespace std;
int main()
{
	char buffer_c[1024] = "outHello\n";
	auto Hello = [buffer_c](const char*buff)//在[]传入元素时编译器回自动在签面加上const,所以前面加上const才匹配
	{//[]内如果是&代表上面的所有参数都可以用
		auto Hello1 = [](const char* buff)
		{
			printf("%sinHello1\n", buff);
		};
		Hello1(buff);
		Hello1(buffer_c);
	};
	char buffer[1024] = "Hello";
	Hello(buffer);
	//输出结果:
	//Hello inHello1
	//outHello
	//inHello1

	char buffer_c3[1024] = "outHello3\n";
	auto Hello3 = [&](char* buff)//[]内如果是&代表上面的所有参数都可以用
	{
		auto Hello4 = [](char* buff)
		{
			printf("%sinHello4\n", buff);
		};
		Hello4(buff);
		Hello4(buffer_c);
		Hello4(buffer_c3);
	};
	char buffer3[1024] = "Hello3";
	Hello3(buffer);
/*输出结果:
Hello inHello4
outHello
inHello4
outHello3
inHello4*/
	return 0;
}

​ Lambda表达式的返回类型会自动推导。除非你指定了返回类型,否则不必使用关键字。返回型类似于通常的方法或函数的返回型部分。但是,返回类型必须在参数列表之后,并且必须在返回类型->之前包含类型关键字。如果lambda主体仅包含一个return语句或该表达式未返回值,则可以省略Lambda表达式的return-type部分。如果lambda主体包含一个return语句,则编译器将从return表达式的类型中推断出return类型。否则,编译器将返回类型推导为void。

#include<iostream>
using namespace std;

class FHello
{
public:
	FHello();
	void Init();
private:
	int a;
	int b;
	float c;
};
FHello::FHello()
{
	a = 0; 
	b = 10;
	c = 20.f;
}

void FHello::Init()
{
	auto Hello_a = [&]()
	{
		cout << a << endl;
	};
	auto Hello_b = [&]()->bool//->返回值 类型(如下操作)
	{
		cout << b << endl;
		return true;
	};

	Hello_a();
	if (bool bHello = Hello_b())
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "false" << endl;
	}
}

int main()
{
	FHello A;
	A.Init();
	return 0;
}

可以使用 throw() 异常规范来指示 lambda 表达式不会引发任何异常。与普通函数一样,如果 lambda 表达式声明 C4297 异常规范且 lambda 体引发异常,Visual C++ 编译器将生成警告 throw() 。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值