美文网首页
c++11 lambda

c++11 lambda

作者: 剑有偏锋 | 来源:发表于2020-01-02 19:29 被阅读0次

    测试代码

    #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中使用当前类的成员函数和成员变量。

    相关文章

      网友评论

          本文标题:c++11 lambda

          本文链接:https://www.haomeiwen.com/subject/xtpooctx.html