ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## \[11+\][$]一.lambda 1. 概念 **匿名函数** 2. 语法格式 + 必须使用尾置返回来指定函数的返回类型。 + **捕获列表** 向lambda传入的外部函数的变量列表。可空,不可省。 + **参数表** 可省。若省略,则表示没有参数。 + **返回类型** 可省。若省略,则编译器从函数体的返回值类型中推断类型。 + **函数体** 不可省。 ```c++ [捕获列表] (参数表) -> 返回类型 {函数体} ``` 3. 当定义一个 `lambda` 时,编译器生成一个与 `lambda` 对应的新的匿名类类型并定义一个该类的常对象。 + 捕获列表相当于这个类的数据成员。在对象初始化时进行初始化,且默认为常数据成员。若需要对这些成员进行修改,需要在参数列表后加上 `mutable`,此时参数列表也不可省 。 `[捕获列表] () mutable -> 返回类型 {函数体}` + `(参数表) -> 返回类型 {函数体}` 这一部分相当于重载了函数调用运算符。参数在对象调用时初始化。 ## \[11+\][$]二.lambda捕获 1. 值捕获,在捕获列表中写变量名称。对象创建时会将值拷贝一份。 >[warning] 请使用 支持C++11标准的编译器运行此例。 ```c++ #include <iostream> using namespace std; int main() { int size = 20; auto f = [size] { return size; }; cout << f(); return 0; } ``` >[test] >20 2. 引用捕获,在捕获列表中写变量名称,并在左边加上 `&` 符号。对象创建时不会将值拷贝一份。 >[warning] 请使用 支持C++11标准的编译器运行此例。 ```c++ #include <iostream> using namespace std; int main() { int size = 20; auto f = [&size] { return size; }; cout << f(); return 0; } ``` >[test] >20 3. 隐式捕获( `=` 和 `&` )。自动捕获外部函数内的所有变量。 4. 总结 | 写法|说明| | ----| ----| | [&变量1,变量2,...]|变量1进行引用捕获,变量2进行值捕获| | [this]|捕获this指针| | [&]|所有变量进行引用捕获| | [=]|所有变量进行值捕获| | [&,变量列表]|变量列表中的变量进行值捕获,其余变量进行引用捕获| | [=,变量列表]|变量列表中的变量进行引用捕获,其余变量进行值捕获| ## [$]三.可调用对象 1. **概念** 可以通过函数调用运算符进行调用的对象。 2. **类型** 函数、函数指针、重载了函数调用运算符的对象、lambda