【C/C++】lameda匿名函数

1.简介

C++中的lambda函数是一种匿名函数,可以在需要函数对象的地方使用,而无需单独定义一个函数。lambda函数可以捕获上下文中的变量,并且可以作为函数指针或函数对象使用。

2.用法

lambda函数的语法如下:

[capture list] (parameter list) -> return type { function body }

其中:

  • capture list:用于捕获上下文中的变量,可以是空的、值捕获、引用捕获或混合捕获。
  • parameter list:lambda函数的参数列表,类似于普通函数的参数列表。
  • return type:指定返回值类型,可以省略,编译器会自动推导。
  • function body:lambda函数的函数体,类似于普通函数的函数体。

下面是一个简单的lambda函数的示例,它接受两个整数参数并返回它们的和:

#include 

int main() {
    // 定义lambda函数
    auto sum = [](int a, int b) -> int {
        return a + b;
    };

    // 调用lambda函数
    int result = sum(3, 4);
    std::cout << "Sum: " << result << std::endl;

    return 0;
}

在上面的示例中,lambda函数被赋值给一个变量sum,然后可以像普通函数一样调用它。

lambda函数还可以捕获上下文中的变量,例如:

#include 

int main() {
    int x = 5;

    // 捕获变量x,并加上lambda函数参数
    auto increment = [x](int a) -> int {
        return x + a;
    };

    // 调用lambda函数
    int result = increment(3);
    std::cout << "Result: " << result << std::endl;

    return 0;
}

在这个示例中,lambda函数捕获了外部变量x,并将其与函数参数相加。

3.关于capture list

在C++中,lambda函数的捕获列表(capture list)可以是以下几种形式:

  1. 空捕获列表:[],表示不捕获任何外部变量。
    示例:[]() { /* lambda函数体 */ }

  2. 值捕获:通过在捕获列表中指定变量名称,以值的方式捕获外部变量。被捕获的变量在lambda函数中被复制,lambda函数内部使用的是复制后的副本。
    示例:[variable] () { /* 使用被捕获的变量 */ }

  3. 引用捕获:通过在捕获列表中指定变量名称前加上&,以引用的方式捕获外部变量。被捕获的变量在lambda函数中可以直接访问和修改。
    示例:[&variable] () { /* 修改被捕获的变量 */ }

  4. 混合捕获:可以同时使用值捕获和引用捕获,以便灵活地捕获外部变量。
    示例:[variable1, &variable2] () { /* 使用变量1,修改变量2 */ }

除了上述捕获方式之外,还可以使用以下特殊捕获方式:

  • 隐式捕获:通过在捕获列表中使用=表示以值的方式捕获所有外部变量,或使用&表示以引用的方式捕获所有外部变量。
    示例:[=] () { /* 使用所有外部变量的副本 */ }[&] () { /* 使用所有外部变量的引用 */ }

  • 初始化列表捕获:在C++14及更高版本中,可以使用初始化列表语法来捕获外部变量,并对其进行初始化。
    示例:[variable = initial_value] () { /* 使用带有初始值的变量副本 */ }

4.注意事项

需要注意的是,在lambda函数中捕获的变量的生命周期应该保持有效,以避免访问已经销毁的变量。此外,对于引用捕获,需要特别注意在lambda函数执行期间不要让被引用的变量超出作用域。

你可能感兴趣的:(C++学习,C/C++,c++,c语言,开发语言)