zoukankan      html  css  js  c++  java
  • lambda函数

    构造一个闭包:一个能在作用域内捕捉变量 的匿名函数对象。

    语法

    [capture](params) mutable exception attribute -> ret{body},完整的声明

    [capture](params) -> ret {body},一个常lambda声明:按副本捕捉的对象不能被修改

    [capture](params){body},省略后缀返回值类型:

      闭包的operator()的返回值类型是根据一下规则推到的:

        如果body仅含有单一的return语句,那么返回值类型是返回表达式的类型(隐式转换之后的类型:右值到左值、数组到指针、函数到指针)

        否则,返回类型是void

    [capture]{body}

      省略参数列表:函数没有参数,即参数是()

    ====================

    mutable--允许body修改传值进来的形参,以及调用他们的非const成员函数

    exception--提供闭包类型的operator()成员函数的异常说明或noexcept语句

    attribute--提供闭包类型的operator()成员函数的属性说明

    capture--指定哪些在函数声明处的作用域可见到的符号 将在函数体内可见

      符号表可按如下规则传入:

        [a,&b]按值捕获a,并按引用捕获b

        [this] 按值捕获了this指针

        [&] 按引用 捕获 lambda表达式所在函数的函数体中  所有的外部变量

        [=] 按值 捕获在lambda表达式所在函数的函数体中提及的   所有外部变量

        []什么也不捕获

    params--参数列表,与命名函数一样

    ret--返回值类型,如果不存在,由该函数return语句来隐式决定(或void,当它不凡会任何值的时候)

    body--函数体

    =================

    来自http://my.oschina.net/wangxuanyihaha/blog/18315

    lambda表达式用于创建并定义匿名的函数对象,来简化编程工作。

    简化的语法可以看作,

    [函数对象参数] (操作符重载函数参数) ->返回值类型 {函数体}

    vector<int> iv{5, 4, 3, 2, 1};
    int a = 2, b = 1;
    
    for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x + b)<<endl;}); // (1)
    
    for_each(iv.begin(), iv.end(), [=](int &x){x *= (a + b);});        // (2)
    
    for_each(iv.begin(), iv.end(), [=](int &x)->int{return x * (a + b);});// (3)
    • []内的参数指的是lambda表达式可以取得的全局变量,1函数中的b就是指函数可以得到lambda表达式外的全局变量,如果在[]中传入=的话,就是可以取得所有的外部变量,如果2和3中的lambda表达式
    • ()内的参数每次调用函数时传入的参数
    • ->后加上的是lambda表达式返回值的类型,如3返回了int类型的变量。
  • 相关阅读:
    cocos2d-x学习笔记(贪吃蛇代码)
    jQuery中animate的height的自适应
    [Docker02]Docker_registry
    [Docker03] Deploy LNMP on Docker
    Python OS Module
    前端设计框架
    Ansible权威指南-读书笔记
    python+selenium之悠悠博客学习笔记
    jenkins入门
    sed
  • 原文地址:https://www.cnblogs.com/li-daphne/p/5546083.html
Copyright © 2011-2022 走看看