📜  Lambda 捕获为 const cpp - C++ (1)

📅  最后修改于: 2023-12-03 15:02:34.102000             🧑  作者: Mango

Lambda 捕获为 const cpp - C++

Lambda表达式是C++11引入的一种匿名函数定义方式,它可以在需要函数对象的地方使用,例如在算法、STL容器、线程等多种场合。Lambda表达式除了可以定义函数体以外,还可以在调用时捕获一些变量。

Lambda捕获是Lambda表达式中引入外部变量的一种方式,比较常见的有值捕获和引用捕获。对于值捕获,捕获的变量可以被修改,同时Lambda表达式中的变量也会被修改。为了防止被修改,可以使用const关键字来声明捕获的变量为只读。

语法

值捕获:[&]或[=]符号后跟要捕获的变量,使用const关键字使变量只读。

int a = 1;
auto lambda = [a]() { /*只读访问a*/ };
auto lambda2 = [=]() { /*只读访问a*/ };
auto lambda3 = [&a]() { /*读写访问a*/ };
auto lambda4 = [&]() { /*读写访问a*/ };

引用捕获:[&]符号后跟要捕获的变量,使用const关键字使变量只读。

int a = 1;
auto lambda = [&a]() { /*读写访问a*/ };
auto lambda2 = [&]() { /*读写访问a*/ };
auto lambda3 = [&](const int b) { /*只读访问a和b*/ };
示例
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5};
    int sum = 5;

    auto lambda = [=]() mutable {
        for (const auto& i : v)
        {
            sum += i;
        }

        std::cout << "The sum is " << sum << std::endl;
        v.push_back(sum);
    };

    lambda();

    for (const auto& i : v)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

The sum is 20
1 2 3 4 5 20

通过值捕获,Lambda表达式中可以读取变量sum和v,但不能修改它们。因为值捕获是按值传递的,所以在修改之前需要将变量声明为mutable

在Lambda表达式中使用值捕获和引用捕获,我们可以将变量进行读写操作和只读操作,通过const关键字我们还可以声明变量只读,避免在Lambda表达式中被意外修改。