zoukankan      html  css  js  c++  java
  • C++之Lambda表达式

    一个lambda表达式的定义形式如下:

     [capture list] (param list) -> return type { function body }

    其中 capture list (捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空),return type 、param list和function body与任意函数一样,分别为返回类型,参数列表和函数体。

    可以忽略函数列表和返回类型,但必须永远包含捕获列表和函数体:

    auto f = [] { return 42; }    
    cout << f() <<endl;  //打印42

    此例中,我们定义了一个可调用对象f,他不接受参数,返回42。

    向lambda传递参数

    例子:

    [] (const string &a,const string & b)
    
    { return a.size() < b.size(); }

    使用捕获列表

    [sz] (const string &a)
    
    { return a.size() >= sz; }

    在[]符号里加上指定的符号,就能指定变量捕获模式,常用的捕获模式如下:

    1、 []:空捕获列表。lambda不能使用所在函数中的变量。一个lambda只有捕获变量后才能使用它们

    2、[names]:names是一个逗号分隔的名字列表,这些名字都是lambda所在函数的局部变量。默认情况下,捕获列表中的变量都被拷贝。名字前如果使用了&,则采用引用捕获方式。

    3、[&]:截取外部作用域中所有变量,并且作为引用在lambda函数中使用,可以简单的理解为,只要外部变量没有被释放,那么在lambda函数中都可以使用。但是局部变量不可以使用,因为局部变量会被释放。

    4、[=]:截取外部作用域中所有变量,并复制一份在lambda函数中使用,即使外部变量的值改变啦,但是在lambda函数执行的时候,依旧是复制时的值。

    5、[=,identifier_list]:identifier_list是一个逗号分隔的列表,包含0个或多个来自所在函数的变量。这些变量都采用引用方式捕获,而任何隐式捕获的变量都采用值方式捕获。identifier_list中的名字不包括this,且这些名字之前必须使用&。例子[=,&hehe]。

    6、[&,identifier_list]:identifier_list中的变量都采用值捕获方式,而任何隐式捕获的变量都采用引用方式捕获。

  • 相关阅读:
    面向对象编程技术的总结和理解(c++)
    对类的理解(c++)
    对指针和引用的理解(c++)
    3DES对称加密算法(ABAP 语言实现版)
    org.springframework.util.Base64Utils线程安全问题
    SAP传输请求自动发布
    ABAP WB01 BDC ”No batch input data for screen & &“ ”没有屏幕 & & 的批输入数据“
    SAP S/4 1610 IDES + HANA 2.0 安装
    ABAP语言实现 左移 <<、无符号右移 >>> 位移操作
    ABAP表抛FTP通用程序
  • 原文地址:https://www.cnblogs.com/roger-jc/p/8321162.html
Copyright © 2011-2022 走看看