zoukankan      html  css  js  c++  java
  • CPP(c++) lambda

    Lambda函数

    参考链接:https://www.cnblogs.com/WindSun/p/11182276.html

    [捕捉列表] (参数) mutable -> 返回值类型 {函数体}
    捕捉列表:捕获外部(referenced)变量。

    int main(int argc, char* argv[])
    {
        int a = 5, b = 7;
        auto total = [](int x, int y)->int {return x + y; };    //接受两个参数
        cout << total(a, b)<<endl;  //12
        auto fun1 = [=] {return a + b; };   //值传递捕捉父作用域变量
        cout << fun1() << endl; //12
        auto fun2 = [&](int c) {b = a + c; a = 1; };    //省略了返回值类型,引用捕获所有
        fun2(3);    //1 8
        cout << a <<" "<< b << endl;
        a = 5; b = 7;   //被修改后,重新赋值
        auto fun3 = [=, &b](int c) mutable {b = a + c; a = 1; };    //以值传递捕捉的变量,在函数体里如果要修改,要加mutaple,因为默认const修饰
        fun3(3);
        cout << a << " " <<b<< endl;    //5,8
        a = 5; b = 7;   //被修改后,重新赋值
        auto fun4 = [=](int x, int y) mutable->int {a += x; b += y; return a + b; };
        int t = fun4(10, 20);
        cout << t << endl;  //42
        cout << a <<" "<< b << endl;    //5 7
        return 0;
    }

    说明
    []是lambda的引出符,捕捉列表能够捕捉上下文中的变量,来供lambda函数使用:
    [ ] //Capture nothing (or, a scorched earth strategy?)
      [var] 表示以值传递方式捕捉变量var//Capture var by making a copy; don’t copy anything else
      [=] 表示值传递捕捉所有父作用域变量 // Capture any referenced variable by making a copy
      [&var] 表示以引用传递方式捕捉变量var
      [&] 表示引用传递捕捉所有父作用域变量 //Capture any referenced variable by reference
      [this] 表示值传递方式捕捉当前的this指针//Capture the this pointer of the enclosing class
       还有一些组合:
      [=,&a] 表示以引用传递方式捕捉a,值传递方式捕捉其他变量
    注意:
    捕捉列表不允许变量重复传递,如:[=,a]、[&,&this],会引起编译时期的错误。

    参数列表与普通函数的参数列表一致。如果不需要传递参数,可以联连同()一同【省略】。
    mutable 可以取消Lambda的常量属性,因为Lambda默认是const属性;multable仅仅是让Lamdba函数体修改值传递的变量,但是修改后并不会影响外部的变量。
    ->返回类型如果是void时,可以连->一起【省略】,如果返回类型很明确,可以省略,让编译器自动推倒类型。
    函数体和普通函数一样,除了可以使用参数之外,还可以使用捕获的变量。

  • 相关阅读:
    一句话解释c#中的特性,你了解多少
    CentOS虚拟机如何设置共享文件夹,并在Windows下映射网络驱动器?
    samba服务器配置及window网络磁盘映射
    PHP中各种Hash算法性能比较
    Redis持久化
    设置redis主从出现的问题
    Redis启动多端口、运行多实例
    Redis学习手册(主从复制)
    tengine/nginx-tomcat动静分离遇到的问题
    使用 Git Hooks 实现自动项目部署
  • 原文地址:https://www.cnblogs.com/heimazaifei/p/12176737.html
Copyright © 2011-2022 走看看