zoukankan      html  css  js  c++  java
  • C++之lambda理解

    简介

    在C++ Primer中,是这样定义的-一个lambda表达式表示一个可调用的代码单元,可以将其理解为一个未命名的内联函数;与任何函数类似,一个lambda具有一个返回类型,一个参数列表和一个函数体,但和函数不同,lambda可能定义在函数内部。

    形式

    表达式规范如下:

    其中

    • (1) 是完整的 lambda 表达式形式。
    • (2) const 类型的 lambda 表达式,该类型的表达式不能改捕获("capture")列表中的值。
    • (3) 省略了返回值类型的 lambda 表达式,但是该 lambda 表达式的返回类型可以按照下列规则推演出来:
      • 如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
      • 如果没有 return 语句,则类似 void f(...) 函数。
    • (4) 省略了参数列表,类似于无参函数 f()。

    使用

    vector<string> arr;
    auto arr_sort = (arr.begin(), arr.end(),[](const string &a, const string &b){
        return a.size() < b.size();
    });
    
    

    上面的函数实现的是比较字符串数组中的字符串,并返回是否较短;

    但是上面的参数列表为空,也就是[]这里面为空,说明此lambda不使用它所在函数中的任何局部变量;

    但是[]这里面的情况有多种,分别是:

    • [] 不截取任何变量
    • [&] 截取外部作用域中所有变量,并作为引用在函数体中使用
    • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
    • [=,&foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量进行引用
    • [bar] 截取bar变量并拷贝一份在函数体中使用,同时不截取其他变量
    • [this] 截取当前类中的指针,如果已经使用了&或者=就默认添加此选项

    注意

    • 如果lambda的函数体包含任何单一return语句之外的内容,而且未指定返回类型,则返回void;
    • 和普通函数不同,lambda不能有默认参数,因此实参数目和形参数目相等;
    • 一个lambda只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体中使用该变量;
    • 捕获列表只用于局部(所在函数中)非static变量,lambda可以直接使用局部static变量和在它所在函数之外声明的名字;
  • 相关阅读:
    Python import模块
    Python 内置函数
    Python Pickle序列化
    android xml布局文件属性说明
    android 中动画
    Android样式——Styles
    代码家
    Android UI目录
    Android 基本控件
    android and webview 网页应用
  • 原文地址:https://www.cnblogs.com/George1994/p/6399880.html
Copyright © 2011-2022 走看看