C++17 中的 Lambda 捕获 *this

2025 年 2 月 11 日 | 阅读 4 分钟

Lambda 表达式 是 C++ 编程中的匿名函数,可以直接在代码中声明。C++17 中新增了在 Lambda 中显式捕获 *this 指针的能力,这使得 Lambda 可以从封闭类中获取此指针。此功能使得在类成员函数内部使用 Lambda 更加容易,并允许它们轻松访问类成员和方法。本文将讨论 C++ 中的 Lambda 捕获,包括其语法、参数、优点和示例。

C++ 中的 Lambda 捕获

Lambda 表达式可以在 C++ 中内联定义,而无需单独的函数声明。它们可以使用捕获子句从其封闭作用域中捕获变量。在 C++17 之前,在 Lambda 中捕获 *this 不太方便,需要变通方法。

C++17 中的 Lambda 捕获 *this

随着 C++17 的发布,在 Lambda 中捕获 *this 指针变得更加容易和自然。它允许 Lambda 直接访问封闭类的成员变量和方法。

捕获 *this 方法的优点

在 C++ 中捕获 *this 方法有以下几个优点:

  • 它允许访问成员变量和方法,从而简化了成员函数内的编程。
  • 它提供了简洁明了的语法,用于在 Lambda 中处理类成员。
  • 在多线程场景中处理成员变量时,它能够轻松实现并行化。

语法

它具有以下语法:

1. 捕获子句 ([capture])

捕获子句允许我们指定哪些来自封闭作用域(Lambda 外部)的变量应该在 Lambda 内部可用。

可选的 [capture] 部分可以采用以下格式:

  1. []:Lambda 无法访问任何外部变量。
  2. [var]:捕获特定变量的值。
  3. [&var]:通过引用捕获特定变量。
  4. [=]:按值捕获所有变量。
  5. [&]:通过引用捕获所有变量。
  6. [=, &var]:所有变量按值捕获,除了 var,它通过引用捕获。
  7. [&, var]:所有变量通过引用捕获,除了 var,它按值捕获。

2. 参数列表 ((parameters))

  • 与函数参数类似,此部分允许我们指定可在 Lambda 主体中使用的参数。
  • 它是可选的。没有参数时可以使用一对空括号 ()。
  • 与常规函数类似,参数可以有类型和名称。

3. mutable 关键字 (mutable)

  • 如果 Lambda 希望更改按值捕获的变量,则可以使用可选的 mutable 关键字。
  • 如果没有 mutable,按值捕获的变量在 Lambda 主体中被视为常量。

4. 返回类型 (-> return_type)

  • 返回类型是可选的。如果省略,编译器将推断返回类型。
  • 如果指定,它表示 Lambda 的返回类型。

5. Lambda 主体 ({ // lambda body })

  • Lambda 将运行的实际代码包含在 Lambda 主体中。
  • 它可以访问从封闭作用域捕获的参数和变量。
  • 主体可以包含一个或多个语句。

示例

让我们看一个例子来说明 C++ 中 Lambda 捕获 *this 方法。

输出

 
Incremented count inside lambda: 6
Incremented count inside lambda: 6
Incremented by 10 inside lambda: 15
The final count is: 5   

说明

这个 C++ 程序定义了一个名为 Counter 的类,负责管理一个计数变量。该类包含通过使用按值捕获 *this 的 Lambda 表达式来修改 Lambda 内部计数的方法,以将计数增加一或按指定数字增加。每次调用 Increment 和 IncrementBy 方法时,它们都会输出最新计数。主函数在末尾打印最终计数,该函数使用这些方法创建和操作 Counter 对象。