温馨提示×

深入理解C++ lambda捕获机制

c++
小樊
114
2024-07-05 18:58:23
栏目: 编程语言

在C++中,lambda表达式是一种匿名函数,可以在函数内部定义并使用,而不需要单独声明函数。lambda表达式可以捕获外部作用域的变量,以便在lambda函数体内使用。

在lambda表达式中,可以使用以下方式来捕获外部变量:

  1. 按值捕获:通过值传递方式捕获外部变量,lambda函数内部可以修改外部变量的副本,但不会影响外部变量本身。
  2. 按引用捕获:通过引用传递方式捕获外部变量,lambda函数内部可以修改外部变量的值,会直接影响外部变量本身。
  3. 按引用捕获(mutable):通过引用传递方式捕获外部变量,但在lambda函数内部可以修改外部变量的值,不会影响外部变量本身。

示例代码:

#include <iostream>

int main() {
    int x = 10;
    int y = 20;

    // 按值捕获
    auto lambda1 = [x, y]() {
        std::cout << "x: " << x << ", y: " << y << std::endl;
    };

    // 按引用捕获
    auto lambda2 = [&x, &y]() {
        x = 100;
        y = 200;
        std::cout << "x: " << x << ", y: " << y << std::endl;
    };

    // 按引用捕获(mutable)
    auto lambda3 = [&x, &y]() mutable {
        x = 100;
        y = 200;
        std::cout << "x: " << x << ", y: " << y << std::endl;
    };

    lambda1();
    lambda2();
    lambda3();

    std::cout << "x: " << x << ", y: " << y << std::endl;

    return 0;
}

在上面的示例代码中,我们定义了三个lambda表达式,分别按值捕获、按引用捕获和按引用捕获(mutable)外部变量x和y。通过调用这些lambda表达式,我们可以看到它们对外部变量的影响不同。lambda1只读取外部变量的值,不会影响外部变量本身;lambda2和lambda3修改了外部变量的值,会影响外部变量本身。

0