C++ Lambda表达式

Lambda表达式

  • 有点类似于JavaScript中的闭包,iOS中的Block, 本质就是函数
  • 完整结构: [capture list](param list)mutable exception-> return type { function body }
    • capture list: 捕获外部变量列表
    • param list:形参列表,不能使用默认参数,不能省略参数名
    • mutable: 用来说明是否可以修改捕获的变量
    • exception: 异常设定
    • return type:返回值类型
    • function body: 函数体
  • 有时可以省略部分结构
    • [capture list](param list)-> return type { function body }
    • [capture list](param list) { function body }
    • [capture list] { function body }

int (*p1)(int, int) = [](int v1, int v2) -> int {
    return  v1 + v2;
};

auto p2 = [](int v1, int v2) {
    return v1 + v2;
};

auto p3 = [](int v1, int v2) {
    return v1 - v2;
}(20, 30);


int exec(int a, int b, int(*func)(int, int)) {
    if (func == nullptr) {
        return 0;
    }
    return func(a, b);
}
  • Lambda表达式 外部变量捕获

     int a = 10;
     int b = 20;
     // 值捕获
     auto func1 = [a, b] {
         std::cout<< a << std::endl;
         std::cout<< b << std::endl;
     };
     a = 11;
     b = 30;
     func1(); // 10, 20
    
     int a = 10;
     int b = 20;
     // 隐式捕获
     auto func2 = [=] {
         std::cout<< a << std::endl;
         std::cout<< b << std::endl;
     };
     a = 11;
     b = 30;
     func2(); // 10, 20
    
    int a = 10;
    int b = 20;
    // a是值捕获,其余变量是地址捕获
    auto func3 = [&, a] {
        std::cout<< a << std::endl;
        std::cout<< b << std::endl;
    };
    a = 11;
    b = 30;
    func3(); // 30, 10
    
    int a = 10;
    int b = 20;
    // a 是引用捕获,b是值捕获
    auto func4 = [&a, b] {
        std::cout<< a << std::endl;
        std::cout<< b << std::endl;
    };
    a = 11;
    b = 30;
    func4(); // 11, 20
    
    int a = 10;
    int b = 20;
    // 隐式捕获(地址捕获)
    auto func5 = [&] {
        std::cout<< a << std::endl;
        std::cout<< b << std::endl;
    };
    a = 11;
    b = 30;
    func5(); // 11, 30
    
    int a = 10;
    int b = 20;
    // a是地址捕获,其余变量是值捕获
    auto func6 = [=, &a] {
        std::cout<< a << std::endl;
        std::cout<< b << std::endl;
    };
    a = 11;
    b = 30;
    func6(); // 20, 11
    
  • Lambda 表达式 mutable

    int a = 10;
    auto func = [a]() mutable {
        std::cout << ++a << std::endl;
    };
    func(); // 11
    std::cout << a << std::endl; // 10
    

你可能感兴趣的:(C++ Lambda表达式)