C++面试题(10)| lambda表达式的底层原理

475 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

image.png

(欢迎大家关注我的微信公众号——控制工程研习,上面会分享很多我学习过程中总结的笔记。)

lambda表达式的原理(来自理想汽车面试题)

答案:

    如果定义了一个lambda表达式,编译器会自动转换成一个仿函数,在该类中重载了operator()。

分析:

什么是lambda表达式

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

[捕捉列表] (参数列表) mutable -> 返回值 {函数体}

    · 捕捉列表:处于lambda函数开始位置,描述了上下文中哪些数据可以被lambda使用,以及使用的方式是传值还是传引用。

捕捉列表说明
[变量名]值传递的方式捕获某变量,按值捕获的类型是 const 的
[=]值传递的方法捕获父作用域的所有变量(包括this)
[&变量名]引用传递的方式捕获某变量(不会复制多一份副本)
[&]引用传递的方法捕获父作用域的所有变量(包括this)
[this]值传递的方式捕获当前的this指针,让 Lambda 表达式拥有和当前类成员同样的访问权限,可以修改类的成员变量,使用类的成员函数

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

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

    · ->返回值类型:与普通函数返回值一样表达函数的返回值类型,可以省略,编译器会对返回值类型进行推导。

    · 函数体:可以使用参数以及捕获到的变量。

底层原理:

图片

    实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如果定义了一个lambda表达式,编译器会自动转换成一个仿函数,在该类中重载了operator()。

仿函数介绍:

    仿函数其实就是重载了operator()运算符的类对象。如下:

struct MyPlus{    
    int operator()(const int &a , const int &b) const{        
        return a + b;    
    }
};

它的调用方法多样:

int main()
{    
    MyPlus a;    
    cout << MyPlus()(1,2) << endl;    //1、通过产生临时对象 调用重载运算符    
    cout << a.operator()(1,2) << endl;//2、通过对象 显示调用重载运算符    
    cout << a(1,2) << endl;           //3、通过对象 隐示地调用重载运算符    
    return 0;
}

参考网站:

[1] blog.csdn.net/YIUECHEN/ar…

[2] blog.csdn.net/weixin_5940…