zoukankan      html  css  js  c++  java
  • c++11新特性(4) lambda捕捉块

    lambda表达式中的方括号成为捕捉块,能够在这里指定怎样从所在的作用域中捕捉变量.
    捕捉的意思是指能够在该lambda中使用该变量.即能够捕获外部变量在lambda表达式内使用.
    能够使用两种方式来捕捉所在的作用域中的全部变量.
    [=]:通过值捕捉全部变量
    [&]:通过引用捕捉全部变量
    指定空白的捕捉块[]表示不从所在作用域中捕捉变量.
    还能够指定捕捉哪些变量以及这些变量的捕捉方法.
    [&x],仅仅通过引用捕捉x,不捕捉其它变量.
    [x] 仅仅通过值捕捉x,不捕捉其它变量.
    [=,&x,&y],默认值捕捉,变量x,y是例外,通过引用捕捉.
    [&,x],默认引用捕捉,X通过值捕捉.
    [&x,&x],非法,标识符不同意反复.


    先看一个简单的不捕捉不论什么变量的样例.
    #include <iostream> 
    using namespace std; 
    int main(){ 


    int n=6; 
    int k=99; 
    cout<<"In first n="<<n<<"   k="<<k<<endl; 
    [](){n=n*2,k=k+1;}(); 
    cout<<"now n="<<n<<"   k="<<k<<endl; 
    }

    结果


    能够看到,未被捕获的变量不能在lambda里面使用.


    再来看看通过值捕捉
    #include <iostream> 
    using namespace std; 
    int main(){ 


    int n=6; 
    int k=99; 
    cout<<"In first n="<<n<<"   k="<<k<<endl; 
    [=](){n=n*2,k=k+1;}(); 
    cout<<"now n="<<n<<"   k="<<k<<endl; 
    }
    结果:


    先来看看上一节中关于mutable的介绍:
    mutable:(可选):假设所在作用域的变量是通过值捕捉的,那么lambda表达式的主体中就不能改动这些副本的值.这些副本默认标记为const,因此lambda表达式主体不能改动这些副本的值.假设lambda表达式标记为mutable,那么这些副本则不是const,因此主体能够改动这些本地副本.(类似于參数传递中的值传递以及引用传递改动源值)


    因此,假设想在lambda中改动捕获的值,应声明为mutable
    #include <iostream> 
    using namespace std; 
    int main(){ 


    int n=6; 
    int k=99; 
    cout<<"In first n="<<n<<"   k="<<k<<endl; 
    [=]()mutable{n=n*2,k=k+1;}(); 
    cout<<"now n="<<n<<"   k="<<k<<endl; 
    }
    结果:


    为什么改动了之后,m和k的值都不变呢?原因是事实上通过值捕获的都是副本来的,细致看mutable就能够看到了.




    那么通过引用捕捉呢?




    #include <iostream> 
    using namespace std; 
    int main(){ 


    int n=6; 
    int k=99; 
    cout<<"In first n="<<n<<"   k="<<k<<endl; 
    [&]()mutable{n=n*2,k=k+1;}(); 
    cout<<"now n="<<n<<"   k="<<k<<endl; 

    }


    能够看到,仅仅有通过引用捕获,才干改动外部变量的值!
    关于lambda捕捉块的介绍就到这里了.
  • 相关阅读:
    es6字符串扩展(+模板字符串拼接)
    MySQL-技术专区-mysql数据库权限管理
    MySQL-技术专区-数据库权限管理
    开源软件的盈利模式
    分布式-技术专区-Redis分布式锁实现-第二步
    分布式-技术专区-Redis分布式锁实现-第一步
    分布式-技术专区-Redis分布式锁原理实现
    JPA接口整理归纳方法规则
    备份整理-实用归纳
    Zookeeper-技术专区-运作流程分析介绍
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5200680.html
Copyright © 2011-2022 走看看