我是靠谱客的博主 跳跃水壶,这篇文章主要介绍C++中的lambda表达式及底层实现原理,现在分享给大家,希望可以做个参考。

什么是lambda表达式

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

在这里插入图片描述

  • 捕捉列表:处于lambda函数开始位置,描述了上下文中哪些数据可以被lambda使用,以及使用的方式是传值还是传引用。
捕捉列表说明
[变量名]值传递的方式捕获某变量
[=]值传递的方法捕获父作用域的所有变量(包括this)
[&变量名]引用传递的方式捕获某变量
[=]引用传递的方法捕获父作用域的所有变量(包括this)
[this]值传递的当值捕获当前的this指针
  • 参数列表:与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。
  • mutable默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略。
  • ->返回值类型:与普通函数返回值一样表达函数的返回值类型,可以省略,编译器会对返回值类型进行推导。
  • 函数体:可以使用参数以及铺货到的变量。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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表达式底层实现原理

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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++中内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部