C++ lambda表达式

2023-12-23 18:36:18

C++ lambda表达式

Lambda 表达式是 C++ 中的一个功能,它允许你创建匿名函数。Lambda 表达式的通用语法如下:

[capture](parameters) mutable -> return_type { body }

各部分的含义如下:

  1. capture:捕获列表,定义了从外部作用域捕获哪些变量以及如何捕获(按值或按引用)。
  2. parameters:参数列表,与普通函数的参数列表类似。
  3. mutable:如果使用了这个关键字,可以修改按值捕获的变量。
  4. return_type:返回类型,可以显式指定,也可以让编译器自动推断。
  5. body:函数体,包含了 lambda 表达式要执行的代码。

捕获列表(Capture)的几种形式:

  1. 不捕获任何外部变量

    []{ /* code */ }
    
  2. 按值捕获所有外部变量

    [=]{ /* code */ }
    
  3. 按引用捕获所有外部变量

    [&]{ /* code */ }
    
  4. 按值捕获特定变量

    [x]{ /* code */ }
    
  5. 按引用捕获特定变量

    [&x]{ /* code */ }
    
  6. 混合捕获模式

    [x, &y]{ /* code */ }
    
  7. 隐式捕获某些变量,显式捕获其他变量

    [=, &x]{ /* code */ }
    [&x, y]{ /* code */ }
    

例子与解释:

  1. 不捕获任何外部变量

    []{ return 42; }
    

    一个简单的 lambda,不使用任何外部变量,返回 42。

  2. 按值捕获外部变量

    int x = 1;
    auto l = [=]{ return x + 1; };
    

    这个 lambda 按值捕获 x,返回 x + 1 的结果。

  3. 按引用捕获外部变量并修改

    int x = 1;
    auto l = [&x]{ ++x; };
    

    按引用捕获 x 并在 lambda 内部对其进行修改。

  4. 具有参数的 lambda

    auto l = [](int a, int b){ return a + b; };
    

    一个接受两个整数参数并返回它们的和的 lambda。

  5. 可变 lambda(修改按值捕获的变量)

    int x = 1;
    auto l = [x]() mutable { return ++x; };
    

    mutable 关键字允许 lambda 修改按值捕获的变量。

  6. 带有显式返回类型的 lambda

    auto l = [](int a, int b) -> double { return (a + b) / 2.0; };
    

    一个计算平均值的 lambda,显式指定返回类型为 double

Lambda 表达式在 C++11 及更高版本中非常有用,特别是在需要简洁的回调函数、临时函数对象或在 STL 算法中使用的场合。在 Qt 中,lambda 通常用于信号和槽的连接,因为它们可以简化代码并提高可读性。

文章来源:https://blog.csdn.net/Johnor/article/details/135171899
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。