c++11 lambda

测试代码

#include <iostream>

int main()
{
    int testvalueA = 1;    
    auto testFuncA = [=](int a, int b)->int {
        //testvalueA += 1; //readonly
        std::cout<<"##inter "<<testvalueA<<std::endl;
        return a+b +testvalueA;
    };
    std::cout<<testvalueA<<std::endl;
    testFuncA(1,1);
    std::cout<<testvalueA<<std::endl;
    std::cout<<std::endl;

    int testvalueB = 1;
    auto testFuncB = [&](int a, int b)->int {
        testvalueB += 1;
        std::cout<<"##inter "<<testvalueB<<std::endl;
        return a+b + testvalueB;
    };
    std::cout<<testvalueB<<std::endl;
    testFuncB(1,1);
    std::cout<<testvalueB<<std::endl;
    std::cout<<std::endl;

    int testvalueC = 1;
    int testvalueD = 1;
    auto testFuncC = [testvalueC, &testvalueD](int a, int b)->int {
        //testvalueC += 1; //readonly
        testvalueD += 1;
        std::cout<<"##inter "<<testvalueC<<" "<<testvalueD<<std::endl;
        return a+b;
    };
    std::cout<<testvalueC<<" "<<testvalueD<<std::endl;
    testFuncC(1,1);
    std::cout<<testvalueC<<" "<<testvalueD<<std::endl;

    return 0;
}

编译输出

 g++   -std=c++11 -o out lambdatest.cpp && ./out
1
##inter 1
1

1
##inter 2
2

1 1
##inter 1 2
1 2

总结

1).[]不捕获任何变量。

2).[&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。

3).[=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。

4).[=,&foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。

5).[bar]按值捕获bar变量,同时不捕获其他变量。

6).[this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项。捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lambda表达式的使用场景 其实我在刚开始使用lambda的时候就挺好奇什么时候使用好,经常在不需要使用的时候使...
    Faith猿_阅读 3,882评论 0 0
  • 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名。1958年,lisp首先采用匿名函数,匿名函数最常用的是...
    Mr希灵阅读 5,379评论 0 1
  • C++11 - Lambda 表达式用法 版权声明:本文为 cheng-zhi 原创文章,可以随意转载,但必须在明...
    登龙zZ阅读 13,650评论 0 6
  • 1、介绍 lambda表达式常用于向函数传递谓词,有些函数的参数只能接受一元谓词(如find_if),但是如果我们...
    一天不工作浑身难受阅读 2,383评论 0 0
  • 1. lambda表达式的定义形式 lambda表达式是C++11引入的一个重要特性之一,来源于函数式编程的概念。...
    georgeguo阅读 7,471评论 0 1