推荐答案
在 C++14 中,广义的 lambda 捕获(generalized lambda capture)允许你在 lambda 表达式中以更灵活的方式捕获变量。你可以通过移动语义或初始化表达式来捕获变量,而不仅仅是按值或按引用捕获。
-- -------------------- ---- ------- -------- ---------- -------- -------- -------- --------- --- ------ - ----------- --- - ------- -------- -- ---- ------ ----- --- - ------ - ---- ------ - ---- - ----------------- - --------- -- --- -- ---------- -- --------- -- --- ------ ------ ------ -- -
在这个例子中,str
被移动到了 lambda 表达式中,而不是简单地按值或按引用捕获。这种方式可以避免不必要的拷贝操作,提高性能。
本题详细解读
广义 lambda 捕获的语法
广义 lambda 捕获的语法允许你在捕获列表中使用初始化表达式。这意味着你可以在捕获时对变量进行初始化或移动。
[capture_list](parameters) -> return_type { body }
在 capture_list
中,你可以使用以下形式:
[x]
:按值捕获变量x
。[&x]
:按引用捕获变量x
。[x = std::move(y)]
:使用移动语义捕获变量y
,并将其命名为x
。[x = expression]
:使用表达式初始化捕获变量x
。
使用场景
广义 lambda 捕获在以下场景中非常有用:
移动语义:当你需要将一个大对象(如
std::string
或std::vector
)传递给 lambda 时,使用移动语义可以避免不必要的拷贝。初始化捕获:当你需要在 lambda 中捕获一个临时变量或表达式的结果时,可以使用初始化捕获。
示例代码解析
-- -------------------- ---- ------- -------- ---------- -------- -------- -------- --------- --- ------ - ----------- --- - ------- -------- -- ---- ------ ----- --- - ------ - ---- ------ - ---- - ----------------- - --------- -- --- -- ---------- -- --------- -- --- ------ ------ ------ -- -
str = std::move(str)
:这里使用了广义 lambda 捕获,将str
移动到 lambda 表达式中。str
在 lambda 内部是一个新的变量,它的值是通过移动构造函数从外部的str
中获取的。lambda()
:调用 lambda 表达式,输出str
的值。
注意事项
- 使用广义 lambda 捕获时,确保你理解移动语义的含义,避免在移动后继续使用被移动的对象。
- 广义 lambda 捕获是 C++14 引入的特性,因此在 C++11 中不可用。
通过广义 lambda 捕获,你可以更灵活地控制变量的捕获方式,从而编写出更高效、更清晰的代码。