c++++ lambda 表达式中的捕获策略决定了 lambda 如何访问外部变量。四种主要策略为:[=] 显式捕获所有变量(按值)、[&] 隐式捕获所有变量(按引用)、[this] 显式捕获当前对象(this 指针),以及 [=, &var1, &var2] 混合捕获(按值捕获某些变量,按引用捕获其他变量)。选择正确的捕获策略对于避免意外行为至关重要,具体取决于 lambda 表达式的预期行为。
C++ lambda 表达式中的 Capture 策略
lambda 表达式是 C++ 中的匿名函数,可以捕获外部变量,从而在lambda 表达式之外使用它们。lambda 表达式中的捕获策略决定了 Lambda 如何访问外部变量。有四种主要捕获策略:
- [=](显式捕获所有变量):Lambda 将显式捕获周围作用域中的所有变量(按值捕获)。
- [&](隐式捕获所有变量):Lambda 将隐式捕获周围作用域中的所有变量(按引用捕获)。
- [this](显式捕获当前对象):Lambda 将显式捕获指向当前对象的指针(this 指针)。
- [=, &var1, &var2](混合捕获):Lambda 将按值捕获某些变量,按引用捕获其他变量。
实战案例:
立即学习“C++免费学习笔记(深入)”;
考虑以下代码:
1 2 3 4 5 6 |
|
解释:
- lambda1 使用 [=] 捕获策略,按值捕获 x。这意味着即使 x 的值改变,lambda1 仍然输出原始值。
- lambda2 使用 [&] 捕获策略,按引用捕获 x。这意味着当 x 的值改变时,lambda2 将输出更新的值。
选择合适的捕获策略:
选择正确的捕获策略取决于 lambda 表达式的预期行为。通常,应选择最具体化的策略,以避免意外的行为:
- 如果 lambda 仅需要访问外部变量的当前值,使用 [=]。
- 如果 lambda 需要修改外部变量的值,使用 [&]。
- 对于涉及对象方法的 lambda 表达式,使用 [this] 或 [&]。