lambda
- 格式
- 捕捉列表说明:
- 细节及使用
- 作为仿函数
格式
lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type { statement }
[捕捉列表] (参数列表) 取消常量性 -> 返回值类型{函数体}
lambda项目 | 细节说明 |
---|---|
捕捉列表 | 作为lambda表达式的起始标志,可以捕捉上下文中的变量供lambda函数使用 |
参数列表 | 与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略 |
mutable | 默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使该修饰符时,参数列表不可省略(即使参数为空)。 |
-> 返回值类型 | 返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行导。 |
{函数体} | 函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量 |
捕捉列表说明:
捕捉列表 | 说明 |
---|---|
[var] | 表示值传递方式捕捉变量var |
[=] | 表示值传递方式捕获所有父作用域中的变量(包括this) |
[&var] | 表示引用传递捕捉变量var |
[&] | 表示引用传递捕捉所有父作用域中的变量(包括this) |
[this] | 表示值传递方式捕捉当前的this指针 |
注意捕捉列表可以连续取内容,但不允许连续捕捉(在捕捉全部值的基础上,再次捕捉值,相反。引用就可以)
父作用域就是包含lambda表达式的呢一块代码{};
细节及使用
在块作用域以外的lambda函数捕捉列表必须为空(全局)
值传递不改变内容:
这两个例子来源网络,做一下理解:
作为仿函数
lambda表达式在作为自定义类型的仿函数时,相当于
重载了()的类
和真正的仿函数底层是一个原理.–>就是实例化一个仿函数对象,调用括号运算符重载.