初探C++ lambda表达式
目录
目前仅仅做一下简单的研究。
为什么要用lambda表达式
- 有些时候C++函数无法使用的地方,lambda表达式依然可以使用,而且更方便简洁。
- 有的函数不好命名字,或者怕重名,或者懒得命名字。
- 将lambda表达式引入后更加简洁,增强了代码的可读性。
- 引用知乎:详细来说就是,在最适合lambda表达式的场景,如果你一定要用class表达,那么你需要为你的类定义一个十分臃肿的构造函数,传进去一大堆参数,然后返回一个值就把这个对象扔了。然而用lambda表达式的话,你只要把这些捕获为闭包就行了。
lambda表达式的格式
一个完整的lambda表达式的组成如下:
[ capture-list ] ( params ) mutable(optional) exception(optional) attribute(optional) -> ret(optional) { body }
1.capture-list:捕获列表。
2.params:和普通函数一样的参数。
3.mutable:只有这个 Lambda 表达式是 mutable 的才允许修改按值捕获的参数。
4.exception:异常标识。
5.attribute:属性标识。暂时不必理解。
6.ret:返回值类型,可以省略,让编译器通过 return 语句自动推导。
7.body:函数的具体逻辑。
或者可以简单去看
[变量使用说明符号](参数列表) -> 返回值数据类型
{
// 函数体
}
lambda的捕获方式
[] //不捕获任何外部变量
[x] //x 按值捕获
[&] //任何外部变量都隐式按引用捕获
[=] //任何外部变量都隐式按值捕获
[x, &y] //x 按值捕获, y 按引用捕获.
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获
[this] // 按值捕获当前对象
值捕获:在lambda表示创建的时候变量被拷贝,不是在调用的时候被拷贝;值捕获不能改变捕获的值,除非用mutable 允许拷贝副本被修改,mutable加在参数列表后面。
引用捕获:可以改变外部变量; 但有可能出现悬挂引用(Dangling reference)必须保证lambda 调用时,捕获引用变量依然有效
lambda的参数列表
它的参数列表跟普通函数的参数列表类似,主要用于接收STL算法传递进来的数据,所以其参数的个数由具体的算法决定,而参数的类型则由容器中所保存数据的类型决定,至于参数的传递形式,到底是传值还是传引用,则由我们是否需要修改容器中的数据决定。例如,Lambda表达式应用在for_each()算法中,这就决定了它只能有一个参数,用以接收算法传递给它的单个数据;而容器中保存的是int类型的数据,所以参数的类型也应该是int类型。至于参数的传递方式,如果我们需要修改容器中的数据,就使用传引用方式,否则直接使用传值方式。
int main() {
auto y = [](int a, int b) {
return a + b;
};
std::cout << y(3, 2); // >: 5
}
从参数列表开始,后面都是可选项,可根据实际情况不需要的话直接省去
int main() {
auto empty = [] {
std::cout << "Wow!空的~" << std::endl;
// 啥也没有只有个函数体};
};
empty(); // >: Wow!空的~
}
作者:世间事无常
链接:https://zhuanlan.zhihu.com/p/206680592
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。