当我给面试官讲了lambda表达式...........

2024-10-09 14:01:23 浏览数 (3)

概念

lambda表达式实际上是一个匿名类的成员函数,该类由编译器为lambda创建,该函数被隐式地定义为内联。因此,调用lambda表达式相当于直接调用它的operator()函数,这个函数可以被编译器内联优化(建议)。

例如快速排序算法,STL允许用户自定义比较方式,在C 11之前,通常使用仿函数实现。但是代码一旦很长,使用之处和仿函数实现的地方相隔甚远,而且如果仿函数的命名不规范,很容易造成使用上的困难。

用法

C 11的lambda表达式是一种允许内联函数的特性,它可以用于不需要重用和命名的代码片段。lambda表达式的一般形式是:

代码语言:javascript复制
[capture](parameters) mutable -> return_type { function_body }

接下来我们介绍一下不同部分:

[captureclause]:捕捉列表。该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。

代码语言:javascript复制
    - []:表示不捕获任何外部变量
    - [=]:以传值的方式捕获外部变量
    - [&]:以传引用的方式捕获外部变量
    - [this]:捕获外部的this指针
    - [=,&a]:以传值的方式捕获外部变量,但是以传引用的方式捕获变量a
    - [a,b]:以值传递的方式捕获外部变量a和b
    - [a,&b]:a以值传递的方式捕获,b以引用的方式捕获

(parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。

mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。

->return-type:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可以省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

{statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

示例

代码语言:javascript复制
int main()
{
	auto func = []()->void {cout << "hello world"<<endl; };
	func();
}

如下:

其实,lambdo的本质就是重载了()

0 人点赞