概述
什么是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表达式及底层实现原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复