当前位置:   article > 正文

【C++】第20篇 超详细讲解 lambda 表达式_c++ 20 lambda

c++ 20 lambda

目录

1、lambda 表达式定义

2、函数定义参数 

2.1 [] 不捕获任何变量

 2.2 [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用

 2.3 [=] 捕获外部所有变量,并作为副本在函数中使用

 2.4 = & 混合使用

 2.5 按某个变量捕获

 3、修饰符:mutable


1、lambda 表达式定义

在 C++ 11 标准中引入 lambda 表达式,用于定义创建匿名函数的对象。

在需要的时间和地点实现功能的闭包,方便快捷。

表达式定义类型:

[函数定义参数](函数参数)修饰符 -> 返回值类型{函数体; };

  1. auto f = [](int num) -> int {return num + 3; };
  2. auto numB = [](int num) -> int {return num + 10; };

 例如:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. auto f = [](int num) -> int {return num + 3; };
  6. cout << f(5) << endl;
  7. return 0;
  8. }

2、函数定义参数 

2.1 [] 不捕获任何变量

  1. #include <iostream>
  2. using namespace std;
  3. // 定义全局变量
  4. static int globalVarA = 20;
  5. int main()
  6. {
  7. // [] 不捕获任何变量
  8. // 全局变量可以在lambda函数体中使用
  9. auto f = [](int num) -> int {return num + 3; };
  10. auto numB = [](int num) -> int {return globalVarA + num; };
  11. cout << f(5) << "\n" << numB(10) << endl;
  12. return 0;
  13. }

 2.2 [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用

按引用使用。

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. // [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用
  6. int fanA = 100;
  7. // 在函数体中可以使用修改 fanA
  8. auto numC = [&](int num) -> int {fanA = 200; return fanA + num; };
  9. cout << numC(20) << "\n" << "fanA = " << fanA <<endl;
  10. }

 2.3 [=] 捕获外部所有变量,并作为副本在函数中使用

按值捕获。 

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. // [=] 捕获外部所有变量,并作为副本在函数中使用
  6. // 按值捕获
  7. int numA = 1000;
  8. // 在lambda函数体中不能操作 numA,例如numA++ 或 numA = 2000
  9. auto f = [=](int num) -> int {return numA + num; };
  10. cout << "numA = " << numA << "\n" << f(1000) << endl;
  11. }

 2.4 = & 混合使用

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. // = & 混合使用
  6. int numA = 100;
  7. int numC = 200;
  8. // 在lambda表达式函数体中,= 表示可以使用外部作用域所有变量,&numA 表示可以修改其值,其余不可以修改。
  9. auto f = [=, &numA](int num) -> int {numA++; return num + numA + numC; };
  10. cout << numA << endl << numC << endl << f(100) << endl;
  11. return 0;
  12. }

 2.5 按某个变量捕获

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. // 按变量捕获
  6. int numA = 1000;
  7. auto f = [numA]() -> int {return numA; };
  8. cout << f() << endl;
  9. return 0;
  10. }

 3、修饰符:mutable

  1. int numA = 100;
  2. auto f1 = [numA]() -> void {numA++;cout << numA << endl; };
  3. f1();

使用参数值传递的时候,在 lambda 函数体内部不可以修改其值。

mutable: 使用参数值传递的时候,在lambda函数体内部不可以修改其值,可以通过添加修饰符mutable。

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. // 修饰符
  6. // mutable: 使用参数值传递的时候,在lambda函数体内部不可以修改其值,可以通过添加修饰符mutable。
  7. int numA = 100;
  8. auto f2 = [numA]() mutable {numA++; cout << numA << endl; };
  9. f2();
  10. return 0;
  11. }

 

  • exception:exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/388388
推荐阅读
相关标签
  

闽ICP备14008679号