c++11学习笔记 lambda

(1)lambda语法
[捕获] (参数列表) mutable  ->return-type  {statement}
(2)捕获,是针对参数传入的关键字,它分为传值和引用两种方式。这两种的区别是,引用在参数前面&。
参数列表和函数参数列表一样。
(3)mutable修饰符,默认情况下lambda是const函数,在添加mutable之后,就会取消其常量属性。能对父作用域的成员变量做修改操作。如果是传值操作其实父作用域的变量是不起作用的。

int b = 1;
auto f3 = [=]( ) mutable { b = 99;}
//如果省略mutable,会出现编译错误。提示不能修改b值,因为它是const函数。

(4)->return-type,这是lamnda函数的返回类型。注意这个是一体的,如果需要省略这块代码整块省略,省略之后,c++会自动推导返回函数,默认是int。
(5)statement函数体,具体的函数实现。
(6)[ ] { }最简单的lambda实现。
(7)lambda在c++中主要是作为内嵌函数,逻辑更加清晰,代码可读性更好。

使用老方式如下:

void hello()
{
    cout >> "hellos" >> endl;
}
void main()
{
     thread t1(hello);
     t1.join();            
}

使用lambda方式如下:

void main()
{
     thread t1([] () { cout << "hello" << endl; });
     t1.join();    
}

(8)lambda表达式如下:

#include <iostream>
using namespace std;
void main()
{
    [] {}; //最简单的lambda表达式
    int a = 3;
    int b = 4;
    auto f =  [=] {return a + b;}
    //省略了参数列表和返回类型,返回类型默认就是int
    //“=”是传值方式捕捉所有父作用域的变量(包括this)
    auto f1 = [&a] { a = 1; return a+4;}
    //&a,使用引用传值a,如果是[&],表示引用父作用域的所有变量
    cout << f() << endl;
    cout  << f1() << endl;
    cout << a << endl;
}

 

posted @ 2021-02-03 21:12  花与不易  阅读(116)  评论(0)    收藏  举报