我是靠谱客的博主 跳跃水壶,最近开发中收集的这篇文章主要介绍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()。

最后

以上就是跳跃水壶为你收集整理的C++中的lambda表达式及底层实现原理的全部内容,希望文章能够帮你解决C++中的lambda表达式及底层实现原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部