Lambda表達(dá)式
- 有點(diǎn)類(lèi)似于JavaScript中的閉包,iOS中的Block, 本質(zhì)就是函數(shù)
- 完整結(jié)構(gòu): [capture list](param list)mutable exception-> return type { function body }
- capture list: 捕獲外部變量列表
- param list:形參列表,不能使用默認(rèn)參數(shù),不能省略參數(shù)名
- mutable: 用來(lái)說(shuō)明是否可以修改捕獲的變量
- exception: 異常設(shè)定
- return type:返回值類(lèi)型
- function body: 函數(shù)體
- 有時(shí)可以省略部分結(jié)構(gòu)
- [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表達(dá)式 外部變量捕獲
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, 20int a = 10; int b = 20; // 隱式捕獲 auto func2 = [=] { std::cout<< a << std::endl; std::cout<< b << std::endl; }; a = 11; b = 30; func2(); // 10, 20int 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, 10int 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, 20int a = 10; int b = 20; // 隱式捕獲(地址捕獲) auto func5 = [&] { std::cout<< a << std::endl; std::cout<< b << std::endl; }; a = 11; b = 30; func5(); // 11, 30int 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 表達(dá)式 mutable
int a = 10; auto func = [a]() mutable { std::cout << ++a << std::endl; }; func(); // 11 std::cout << a << std::endl; // 10