C++ 中的 lamda 表达式是 C++11 标准引入的特性,用于创建匿名函数。它的实现原理涉及到编译器的词法分析、语法分析以及闭包的概念。

使用方法:

1
// 显示设置返回值
[capture](parameters) -> return_type
    // lamda body
// 编译器自动推理返回值
[capture](parameters)
    // lamda body

其中:

  • capture:捕获列表,用于捕获外部变量
  • parameters:函数参数列表
  • return_type:返回类型
  • lamda body:函数体

Lambda表达式的实现原理大致可以分为以下几个步骤:

  1. 词法分析和语法分析 :编译器首先对lambda表达式进行词法分析和语法分析,将其分解为各个组成部分,包括捕获列表、参数列表、返回类型和函数体。
  2. 生成闭包类 :编译器会根据lambda表达式的内容生成一个匿名的闭包(或函数对象)类,该类用于封装lambda表达式的行为。这个类通常会包括捕获的外部变量、参数和函数体等成员。
  3. 生成函数调用运算符重载 :闭包类中会定义函数调用运算符( operator() )的重载,用于实现lambda表达式的执行。该运算符的实现就是lambda表达式的函数体。
  4. 生成实际的lambda对象 :编译器根据生成的闭包类和函数调用运算符,生成一个实际的lambda对象,该对象可以像函数一样被调用。
  5. 捕获外部变量 :如果lambda表达式中使用了外部变量,编译器会根据捕获列表的要求,将这些变量以某种方式传递给闭包对象,使得在lambda表达式内部可以访问这些变量。

使用

1
#include <iostream>
int main()
	int x = 10;
  // 编译器自动推导出返回类型
	/*auto square = [x](int num) {
		return num * num + x;
  // 显示定义 lamda 函数返回类型
  auto square = [x](int num) -> int
    return num * num + x;
	std::cout << "Result: " << square(5) << std::endl;  // 输出:Result:35

编译器会生成一个类似于函数对象的闭包类,实现了捕获外部变量和函数体的功能。运行时,可以像调用普通函数一样调用这个 lamda 表达式

会转化为下面的代码

1
class LambdaFunction{
public:
  LambdaFunction(int captured_x) : x(captured_x) {}
  int operator()(int num) const{
    return num * num + x;
private:
  int x;
int main() {
  int x = 10;
  LamdaFunction square = LamdaFuntion(x);