C++--- Lambda匿名函数表达式

 

格式:

[函数对象参数] (形参) mutable 或 exception 声明 -> 返回值类型 {函数体}

[函数对象参数]:

[]表示表达式的开始,必须有;用来设置如何捕获匿名函数外的变量

[ ]里为空

  [ ]里为空,表示任何变量都不会传递给lambda表达式,没有参数

int a = 10;
    int b = 20;
    int c;
    int x = []()->int {return 100; }();//不能捕获匿名函数外的所有变量


    std::cout << "x=" << x << std::endl;

    return 0;

 

[=]

[=]  表示默认按值传递,编译器自动为我们按值传递了所有局部变量

按值传递:语句体内修改变量值,不会影响外面的变量值

注意:捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止

int a = 10;
int b = 20;
int c = 30;
int x = [=]()->int {int a = 100; return b + c; }();//按传值方式可以捕获所有外部变量


std::cout << "x=" << x << std::endl;
std::cout << "a=" << a << std::endl;

 

  

[&]

[&]  表示默认按引用传递

引用传递,由于两个变量指向同一个数据,所以语句体内修改变量值,会影响外面的变量值

#include <iostream>


int main() {
    
    int a = 10;
    int b = 20;
    int c=30;
    int x = [&]()->int {a++;std::cout << "内部a=" << a << std::endl; return b + c; }();//按引用方式可以捕获所有外部变量
    
    std::cout << "x=" << x << std::endl;
    std::cout << "外部a=" << a << std::endl;

    return 0;

}

 [变量名]

[var]:var是变量名,只传递变量var,其它不能传;前面可以添加&前缀,表示var变量按引用传递

[x, &y]    //x 按值捕获, y 按引用捕获

int a = 10;
    int b = 20;
    int c;
    int x = [a, b]()->int {return a + b; }();//只能捕获a和b变量,不能捕获c变量


    std::cout << "x=" << x << std::endl;

  [ =,&var] :引用捕获变量var,其他外部变量使用值捕获

  [ &,var]:值捕获变量var,其他外部变量使用引用捕获

 

[this] 

this:函数体内可以使用 Lambda 所在类中的所有成员变量和成员函数

#include <iostream>

class A {
public:
    A(int a=0):m_i(a){}
    void print() {
        
        x= [this]()->int { return this->m_i+100; }();  //用this指针使用类成员
        std::cout << "x=" << x << std::endl;
    }

private:
    int m_i;
    int x;
    
};

int main() {
    
    A d(11);
    d.print();

    return 0;

}

 

   

 

 (形参)

    参数列表--lambda表达式自己的参数列表

没有参数可以省略

可以按值传递,如 (a,b);也可以按引用传递,如 (&a,&b)

#include <iostream>

auto lambda = [](int value) { std::cout << "value: " << value << std::endl; };  //定义一个匿名函数
//注意:最后面没有(),所以没有执行

int main() {
    
    lambda(56); //执行匿名函数

    return 0;

}

 

 

mutable 选项(可选)--按值传递时使用

  加上mutable后,在语句体内可以修改变量值;省略变量只能只读,但不会修改函数体外的值

#include <iostream>


int main() {
    
    int a = 10;
    int b = 20;
    int c=30;
    int x = [=]()mutable->int {a++;std::cout << "内部a=" << a << std::endl; return b + c; }();
    //按值传递时,匿名函数内默认不能修改外部变量值
    //加上mutable修饰符就可以修改,但是按局部变量处理


    std::cout << "x=" << x << std::endl;
    std::cout << "外部a=" << a << std::endl;

    return 0;

}

 

 

  

returm-type---返回值类型

如果只有一处return时,可以省略,自动判断出类型

int ret=[]()->int{return 1000;}();

{}  语句实现体

 

 

posted @ 2019-09-02 20:36  天子骄龙  阅读(321)  评论(0编辑  收藏  举报