C++日记

今天看C++多线程和进程时,注意到一个叫作lambda的表达式语法,了解了一下
模板如下:
[捕获列表]<模板声明>(参数列表)mutable 异常说明->类型{函数体}

格式 内容
捕获列表 允许访问当前作用域下的某一个(些)变量
模板声明 与普通函数的模板相同(但省略template关键字)
参数列表(可选) lambda函数的参数,若无参数,可以连括号一起省略(当然也可以保留,不过没必要),不能有不定参数,不能有默认参数,参数必须有名称(C++14标准允许以auto作为参数类型)
mutable(可选) 指定捕获列表以值传递的变量可以被修改,但不会改变变量本身(相当于普通函数的值传递),引用传递的变量不变(捕获列表的变量传递方式见下表)
异常说明(可选) 指定lambda可能抛出的异常,例如throw(int)、noexcept
类型(可选) 指定返回值类型,包括void类型(如果返回类型比较明显,可以省略,让编译器自动推断,省略时要连同箭头->一起省略)如果省略了参数列表的括号,那么不能指定此项
函数体 函数中要执行的代码,如果没有return语句且没指定类型,默认返回类型为void

字符如下:

[] 什么也不捕获
[var] 捕获当前作用域var变量,值传递(不能修改捕获变量值),也叫按值捕获
[&var] 捕获当前作用域var变量,引用传递(可以修改捕获变量值),也叫引用捕获
[=] 捕获当前作用域所有变量,值传递
[&] 捕获当前作用域所有变量,引用传递
[=,&var] 捕获当前作用域所有变量,以值传递,但以引用传递var(也可以使用[&,var]来进行值传递)
[this] 捕获class的this指针,如果捕获列表指定了[=]或[&],则会自动传递this(PS:不能捕获成员变量,只能捕获this指针,用this指针访问成员变量)

例子1:
[]<class T>(T v) noexcept -> void{
cout << v << endl;
}("blog.csdn.net");
例子2:
int M=100,N=10
auto g=[N,&M](int i){
M=20;
return N*i;
};
这个表达式的作用和意义就是简化函数,有点像内联函数,但lambda表达式是C++11之后加入的特性,它的意义和作用有以下几个方面:

1.简化代码:lambda表达式可以将一些简单的函数或操作以更简洁的方式表达出来。通过使用lambda表达式,可以减少代码量,使代码更易读和理解。

2.函数式编程:lambda表达式是函数式编程的基础。函数式编程强调以函数为基本构建块,通过将函数作为参数传递或返回函数来实现灵活的编程方式。lambda表达式使得函数能够像其他数据类型一样被处理和操作,方便在函数式编程中使用。

3.匿名函数:lambda表达式是一种匿名函数形式,它不需要为函数定义名称,直接在需要的地方定义和使用。这在某些情况下,特别是需要一次性使用的简单函数场景下,可以减少代码的复杂性。

4.回调函数:lambda表达式常常用作回调函数,即将一个函数作为参数传递给另一个函数。回调函数通常用于事件处理、异步编程等场景中,lambda表达式可以方便地定义并传递回调函数,提高代码的灵活性和可读性。

posted @ 2023-07-08 20:16  Xuuio  阅读(5)  评论(0编辑  收藏  举报