【C++】第20篇 超详细讲解 lambda 表达式
C++ 详细 20 讲解 表达式 lambda
2023-09-14 09:14:31 时间
目录
2.2 [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用
1、lambda 表达式定义
在 C++ 11 标准中引入 lambda 表达式,用于定义创建匿名函数的对象。
在需要的时间和地点实现功能的闭包,方便快捷。
表达式定义类型:
[函数定义参数](函数参数)修饰符 -> 返回值类型{函数体; };
auto f = [](int num) -> int {return num + 3; };
auto numB = [](int num) -> int {return num + 10; };
例如:
#include <iostream>
using namespace std;
int main()
{
auto f = [](int num) -> int {return num + 3; };
cout << f(5) << endl;
return 0;
}
2、函数定义参数
2.1 [] 不捕获任何变量
#include <iostream>
using namespace std;
// 定义全局变量
static int globalVarA = 20;
int main()
{
// [] 不捕获任何变量
// 全局变量可以在lambda函数体中使用
auto f = [](int num) -> int {return num + 3; };
auto numB = [](int num) -> int {return globalVarA + num; };
cout << f(5) << "\n" << numB(10) << endl;
return 0;
}
2.2 [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用
按引用使用。
#include <iostream>
using namespace std;
int main()
{
// [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用
int fanA = 100;
// 在函数体中可以使用修改 fanA
auto numC = [&](int num) -> int {fanA = 200; return fanA + num; };
cout << numC(20) << "\n" << "fanA = " << fanA <<endl;
}
2.3 [=] 捕获外部所有变量,并作为副本在函数中使用
按值捕获。
#include <iostream>
using namespace std;
int main()
{
// [=] 捕获外部所有变量,并作为副本在函数中使用
// 按值捕获
int numA = 1000;
// 在lambda函数体中不能操作 numA,例如numA++ 或 numA = 2000。
auto f = [=](int num) -> int {return numA + num; };
cout << "numA = " << numA << "\n" << f(1000) << endl;
}
2.4 = & 混合使用
#include <iostream>
using namespace std;
int main()
{
// = & 混合使用
int numA = 100;
int numC = 200;
// 在lambda表达式函数体中,= 表示可以使用外部作用域所有变量,&numA 表示可以修改其值,其余不可以修改。
auto f = [=, &numA](int num) -> int {numA++; return num + numA + numC; };
cout << numA << endl << numC << endl << f(100) << endl;
return 0;
}
2.5 按某个变量捕获
#include <iostream>
using namespace std;
int main()
{
// 按变量捕获
int numA = 1000;
auto f = [numA]() -> int {return numA; };
cout << f() << endl;
return 0;
}
3、修饰符:mutable
int numA = 100;
auto f1 = [numA]() -> void {numA++;cout << numA << endl; };
f1();
使用参数值传递的时候,在 lambda 函数体内部不可以修改其值。
mutable: 使用参数值传递的时候,在lambda函数体内部不可以修改其值,可以通过添加修饰符mutable。
#include <iostream>
using namespace std;
int main()
{
// 修饰符
// mutable: 使用参数值传递的时候,在lambda函数体内部不可以修改其值,可以通过添加修饰符mutable。
int numA = 100;
auto f2 = [numA]() mutable {numA++; cout << numA << endl; };
f2();
return 0;
}
-
exception:exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。
相关文章
- 老梁聊C++,为什么不能修改set里的值?如果非要修改怎么办?
- C++构造函数的作用_c++什么是构造函数
- C语言和C++的区别和联系
- c++版本cef详细使用
- c++ 引用
- 树和二叉树的存储结构的实现(C/C++实现)详解编程语言
- C++ sort(STL sort)排序算法详解
- C++关系运算符(超详细)
- C++函数定义和调用过程(超详细)
- C++函数引用传递(超详细)
- C++中delete和delete[]的区别详细介绍
- c++指针与引用的区别介绍及使用说明
- C++指向类成员函数的指针详细解析
- C++的sstream标准库详细介绍
- C/C++宏定义的可变参数详细解析
- C++Explicit关键字详细解析
- C/C++中static,const,inline三种关键字详细总结
- C++空类默认函数详细解析
- C++符号优先级(详细整理)
- C/C++回调函数介绍
- C/C++数据对齐详细解析
- C++运算符重载的方法详细解析
- C++中函数模板的用法详细解析