zoukankan      html  css  js  c++  java
  • lambda

    lambdas

    类似于一种 inline function,能被当作是一种参数或是一种局部对象。

    看到中括号开头的那就是 lambda 啦~~~

    [] {
        std::cout << "hello lambda!" << std::endl;
    };
    
    [] {
        std::cout << "hello lambda!" << std::endl;
    } (); //prints "hello lambda!"
    
    //or pass it to objects to get called:
    
    auto l = [] {
        std::cout << "hello lambda!" << std::endl;
    };
    
    ···
    l(); //prints "hello lambda!"
    

    [] 是 lambda introducer,看到这个中括号就表明是个 lambda 表达式。

    [···] (···) mutable throwSpec -> retType {···}

    int id = 0;
    auto f = [id] () mutable {      // 此处的 mutable 表示 [] 中的内容即 id 可变; 如果不加 mutable 关键字,id 是不能 ++ 的!!
        std::cout << "id:" << id << std::endl;
        ++id; //OK
    }
    
    id = 42;
    f();
    f();
    f();
    std::cout << id << std::endl;
    

    得到结果:

    id: 0
    id: 1
    id: 2
    42
    

    怎么理解呢?????

    lambda 类型可以理解成是一种匿名函数对象:

    class Function {
    private:
        int id; //copy of outside id
    public:
        void operator()() {
            std::cout << "id:" << id << std::endl;
            ++id; //OK
        }
    };
    
    Function f;
    

    这样就不难理解上述 lambda 对象 f 的行为了。在构造 lambda 表达式之前 id = 0, 那么此时构造 lambda 表达式,相当于构造了一个 Function 类,类中的 member data 就是通过 [] 传进来的值。此时 f.id = 0,所以之后程序执行到 id = 42,并不会影响到 f 中的 member data!!!

    当 pass by reference 时又会发生什么呢?

    
    int id = 0;
    auto f = [&id] (int param) {
        std::cout << "id:" << id << std::endl;
        ++id; ++param;//OK
    }
    
    id = 42;
    f(7);
    f(7);
    f(7);
    std::cout << id << std::endl;
    

    得到结果:

    id: 42
    id: 43
    id: 44
    45
    

    可以说这个结果是在意料之中的!

    看一个编译器为 lambda 产生的代码:

    int tobefound = 5;
    auto l = [tobefound] (int val) {return val == tobefound;};
    
    // 编译器对 lambda 表达式解释成如下:
    //=======================================================
    class UnNamedLocalFunction
    {
        int localVar;
    public:
        UnNamedLocalFunction(int var) : localVal(var) {}
        bool operator()(int val)
        {   return val == tobefound;    }
    }
    
    UnNamedLocalFunction l(tobefound);
    //=======================================================
    
    bool b1 = l(5);
    
  • 相关阅读:
    腰围2尺1,2,3,4,5,6,7,8寸各自等于是多少厘米/英寸(对比表)
    Android开发模板------自己定义SimpleCursorAdapter的使用
    怎样在多线程中使用JNI?
    UVa753/POJ1087_A Plug for UNIX(网络流最大流)(小白书图论专题)
    图解iPhone开发新手教程
    Why Hadoop2
    读完了csapp(中文名:深入理解计算机系统)
    hadoop备战:一台x86计算机搭建hadoop的全分布式集群
    Win7 公布网站 HTTP 错误 404.4
    Dump 文件生成与分析
  • 原文地址:https://www.cnblogs.com/Codroc/p/13998419.html
Copyright © 2011-2022 走看看