Lambda
Lambda
xingzhu基本用法
1 | // 语法格式 |
其中 capture 是捕获列表,params 是参数列表,opt 是函数选项,ret 是返回值类型,body 是函数体
- 捕获列表
[]:捕获一定范围内的变量 - 参数列表
():和普通函数的参数列表一样,如果没有参数参数列表可以省略不写 opt选项, 不需要可以省略mutable:可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)exception:指定函数抛出的异常,如抛出整数类型的异常,可以使用throw();
- 返回值类型:在 C++11 中,
lambda表达式的返回值是通过返回值后置语法来定义的 - 函数体:函数的实现,这部分不能省略,但函数体可以为空
捕获列表
[]不捕捉任何变量[&]捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)[=]捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)- 拷贝的副本在匿名函数体内部是只读的
[=, &foo]按值捕获外部作用域中所有变量, 并按照引用捕获外部变量foo[bar]按值捕获bar变量, 同时不捕获其他变量[&bar]按引用捕获bar变量, 同时不捕获其他变量[this]捕获当前类中的this指针- 这个是在类中定义函数时的捕获,不管
[this], [=], [&]都可访问成员属性和函数,并且修改成员变量的值 - 如果是在类外使用
&或者=并且创建了类对象,也会捕捉到,=是只读状态不可修改成员变量值,&修改会引起成员变量值改变
- 这个是在类中定义函数时的捕获,不管
1 | // 执行体后面加 () 就是表示函数的调用 |
1 | void func(int x, int y) { |
返回值
1 | // 完整的lambda表达式定义 |
函数本质
lambda表达式的类型在 C++11 中会被看做是一个带operator()的类,即仿函数- 按照 C++标准,
lambda表达式的operator()默认是const的,一个const成员函数是无法修改成员变量值的 mutable选项的作用就在于取消operator()的const属性
使用
std::function和std::bind来存储和操作lambda表达式
1 | // 因为本质是一个仿函数 |
对于没有捕获任何变量的
lambda表达式,可以转换成一个普通的函数指针
1 | using func_ptr = int(*)(int); |
说明:本文是在 https://subingwen.cn/ 学习过程中的总结,这个 up 主 B 站讲得很好 !!
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果










