lambda表达式

20210830补充

可以使用方式在C++中使用匿名函数

void func(){
    auto f = [](int x, int y){return x > y ? x : y;};
    
    cout << f(1,2) << endl;
}

 

 

Lambda表达式实际上提供一个匿名函数的特性。

而匿名函数则是在需要一个函数,又不想去费力命名一个函数的情况下去使用的。

[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {
     // 函数体
}

  略去一般函数名,返回值用一个->形式进行。

所谓捕捉列表,其实可以理解为参数的一种类型,lambda表达式内部函数体在默认情况下是不能够

使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。

    根据传递的行为,捕获列表也可以分为以下几种:

1)值捕获
    与参数传值类似,捕获的前提是变量可以拷贝,不同之处在于,被捕获的变量在lambda表达式被创建时拷贝

,而非调用时才拷贝

void learn_lambda_func_1() {   
     int value_1 = 1;    
    auto copy_value_1 = [value_1] {      
          return value_1;    
     };    
    value_1 = 100;    
     auto stored_value_1 = copy_value_1();   
     // 这时, stored_value_1 == 1, 而 value_1 == 100.    
    // 因为 copy_value_1 在创建时就保存了一份 value_1 的拷贝
}

2)引用捕获

与引用传参类似,引用捕获保存的是引用,值会发生变化

 void learn_lambda_func2(){
    int value_2 = 1;
    auto copy_value_2 = [&value_2]{
    return value_2;
   };
    value_2 = 100;
    auto stored_value_2 = copy_value_2();
   //此时,stored_value_2 == 100, value_1 == 100
   //这是因为 copy_value_2 保存的是引用
}

3) 隐式捕获

在捕获列表中写一个&或= 向编译器声明采用引用捕获或者值捕获。

总结:捕获提供了lambda表达式对外部值进行使用的功能,捕获列表最常用的四种形式:

[] 空捕获列表

[name1,name2,.....]捕获一系列变量

[&]引用捕获,让编译器自行推导捕获列表

[=]值捕获,让编译器执行推导应用列表

 

---------------------------------------------------------------------------------------------------------------------------------

知识点是参考实验楼大佬的。不提供转载和分享。

来自《100行C++代码实现线程池》,有需要的童鞋就去开个年费吧。大约也就一天一块钱。

侵删,底下是传送门。

https://www.shiyanlou.com/courses/565/labs/1909/document

posted @ 2019-03-06 19:30  王清河  阅读(194)  评论(0编辑  收藏  举报