C++中的lambda表达式及底层实现原理

什么是lambda表达式

lambda表达式是一种匿名表达式,一格式般定义为:

在这里插入图片描述

  • 捕捉列表:处于lambda函数开始位置,描述了上下文中哪些数据可以被lambda使用,以及使用的方式是传值还是传引用。
捕捉列表说明
[变量名]值传递的方式捕获某变量
[=]值传递的方法捕获父作用域的所有变量(包括this)
[&变量名]引用传递的方式捕获某变量
[=]引用传递的方法捕获父作用域的所有变量(包括this)
[this]值传递的当值捕获当前的this指针
  • 参数列表:与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。
  • mutable默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略。
  • ->返回值类型:与普通函数返回值一样表达函数的返回值类型,可以省略,编译器会对返回值类型进行推导。
  • 函数体:可以使用参数以及铺货到的变量。
int main(){
    //最简单的lamber表达式,没有任何意义
    []{};
    
    //省略参数列表和返回值类型,由编译器推导
    int a=3,b=4;
    [=]{return a+b;};//函数体内的分号不要忘记
   
  	//引用传递的方式可以改变变量的值
    auto func1=[&](int c){return b=a+c};
    func(10);  
    
    //值传递捕获不能改变变量的值,除非使用mutable
    auto fun2=[=](int c)mutable{return b=a+c;};
    fun(10);
    return 0;

lambda表达式底层实现原理

class Add{
public:
	Add(int n):_a(n){
	}

	int operator()(int n){
		return _a + n;
	}
private:
	int _a;
};

int main(){
	int n = 2;
	Add a(n);
	a(4);

	auto a2 = [=](int m)->int{return n + m; };
	a2(4);
	return 0;
} 

从上面的代码中可以看到,仿函数与lambda表达式完全一样
在这里插入图片描述
实际当我们编写了一个lambda表达式之后,编译器将该表达式翻译成一个未命名类的未命名对象。该类含有一个operator()。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页