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() 。