C++ 面试题 目录

C++14 中广义的 lambda 捕获 (generalized lambda capture) 的用法?

推荐答案

在 C++14 中,广义的 lambda 捕获(generalized lambda capture)允许你在 lambda 表达式中以更灵活的方式捕获变量。你可以通过移动语义或初始化表达式来捕获变量,而不仅仅是按值或按引用捕获。

-- -------------------- ---- -------
-------- ----------
-------- --------
-------- ---------

--- ------ -
    ----------- --- - ------- --------
    
    -- ---- ------ ----- --- - ------ -
    ---- ------ - ---- - ----------------- -
        --------- -- --- -- ----------
    --
    
    ---------  -- --- ------ ------
    
    ------ --
-

在这个例子中,str 被移动到了 lambda 表达式中,而不是简单地按值或按引用捕获。这种方式可以避免不必要的拷贝操作,提高性能。

本题详细解读

广义 lambda 捕获的语法

广义 lambda 捕获的语法允许你在捕获列表中使用初始化表达式。这意味着你可以在捕获时对变量进行初始化或移动。

capture_list 中,你可以使用以下形式:

  • [x]:按值捕获变量 x
  • [&x]:按引用捕获变量 x
  • [x = std::move(y)]:使用移动语义捕获变量 y,并将其命名为 x
  • [x = expression]:使用表达式初始化捕获变量 x

使用场景

广义 lambda 捕获在以下场景中非常有用:

  1. 移动语义:当你需要将一个大对象(如 std::stringstd::vector)传递给 lambda 时,使用移动语义可以避免不必要的拷贝。

  2. 初始化捕获:当你需要在 lambda 中捕获一个临时变量或表达式的结果时,可以使用初始化捕获。

示例代码解析

-- -------------------- ---- -------
-------- ----------
-------- --------
-------- ---------

--- ------ -
    ----------- --- - ------- --------
    
    -- ---- ------ ----- --- - ------ -
    ---- ------ - ---- - ----------------- -
        --------- -- --- -- ----------
    --
    
    ---------  -- --- ------ ------
    
    ------ --
-
  • str = std::move(str):这里使用了广义 lambda 捕获,将 str 移动到 lambda 表达式中。str 在 lambda 内部是一个新的变量,它的值是通过移动构造函数从外部的 str 中获取的。
  • lambda():调用 lambda 表达式,输出 str 的值。

注意事项

  • 使用广义 lambda 捕获时,确保你理解移动语义的含义,避免在移动后继续使用被移动的对象。
  • 广义 lambda 捕获是 C++14 引入的特性,因此在 C++11 中不可用。

通过广义 lambda 捕获,你可以更灵活地控制变量的捕获方式,从而编写出更高效、更清晰的代码。

纠错
反馈