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 站讲得很好 !!
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果