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++免费学习笔记(深入)”;
考虑以下代码:
int x = 10; auto lambda1 = [=] { cout << x << endl; }; // 按值捕获 x auto lambda2 = [&] { cout << x << endl; }; // 按引用捕获 x x = 20; lambda1(); // 输出 10(按值捕获) lambda2(); // 输出 20(按引用捕获)
解释:
lambda1 使用 [=] 捕获策略,按值捕获 x。这意味着即使 x 的值改变,lambda1 仍然输出原始值。
lambda2 使用 [&] 捕获策略,按引用捕获 x。这意味着当 x 的值改变时,lambda2 将输出更新的值。
选择合适的捕获策略:
选择正确的捕获策略取决于 lambda 表达式的预期行为。通常,应选择最具体化的策略,以避免意外的行为:
如果 lambda 仅需要访问外部变量的当前值,使用 [=]。
如果 lambda 需要修改外部变量的值,使用 [&]。
对于涉及对象方法的 lambda 表达式,使用 [this] 或 [&]。
以上就是C++ lambda 表达式中的 Capture 策略如何工作?的详细内容,更多请关注本网内其它相关文章!