捕获列表决定Lambda表达式如何访问外部变量:【=】按值捕获使用到的局部变量副本,【&】按引用捕获原变量,混合捕获如[=, &y]更安全清晰,本质是编译为闭包类成员。
捕获列表是 C++ Lambda 表达式中用于指定如何访问外部作用域变量的关键语法部分,它决定了 lambda 函数体内部能否以及以何种方式(值拷贝 or 引用)使用定义位置附近的局部变量。
写成 [=] 表示:对当前作用域中所有**被 lambda 体实际使用到的自动变量(local variables)**,都以**值拷贝的方式**捕获。编译器会为每个被捕获的变量在 lambda 对象内部创建一份独立副本。
[=] 修改外部变量本身(除非 lambda 声明为 mutable,此时修改的也只是副本);[=] 不捕获 this 指针(类成员函数内需显式写 [=, this]
或直接用 [this])。写成 [&] 表示:对所有**被 lambda 体实际使用到的自动变量**,都以**引用方式**捕获。lambda 内部操作的就是原始变量本身。
mutable;[&] 默认也捕获 this(即隐含 [&, this]),因此能访问和修改成员变量。实际开发中,推荐避免纯 [=] 或纯 [&],而采用显式列表(如 [x, &y, z])或混合形式(如 [=, &y]、[&, x]),原因:
int a = 10; std::string s = "hello"; auto f = [=, &s]() { a++; s += "!"; }; —— a 是副本(修改无效),s 是引用(修改生效)。编译器把 lambda 编译成一个匿名类,捕获的变量变成该类的成员:
[=] → 成员是 const T(或带 mutable 时为 T);[&] → 成员是 T&;