C++ 语言特性06 - lambda表达式

一:概述

        1. lambda表达式语法, lambda表达式是在C++11标准中引入的,它们可以捕获外部变量的值或引用。

[ captures ] ( params ) specifiers exception -> ret { body }

其中:
   captures 是捕获列表,用于捕获当前函数作用域的变量,分为按值捕获和按引用捕获。
   params 是可选参数列表,和普通函数一样。
   specifiers 是可选限定符,C++中可以用mutable,它允许在lambda中改变按值。
   exception 是可选异常说明符,C++中使用noexcept指明lambda是否会抛出异常
   ret 是可选返回值类型。

   

        2. lambda表达式的例子

#include <iostream>
int main()
{
    int a = 10;
    auto foo = [a](int b)->int { return a * b; };
    std::cout << foo(8) << std::endl;
}

    3. 什么是无状态的正则表达式, 一个例子

//无状态的lambda表达式不捕获任何外部变量,或者只以值的方式捕获不会改变的常量

#include <iostream>
#include <functional>

int main() {
    // 定义一个无状态的lambda表达式
    auto add = [](int x, int y) {
        return x + y;
    };

    // 调用无状态的lambda表达式
    int result = add(2, 3);
    std::cout << result << std::endl;  // 输出 5

    return 0;
}


二:注意事项

         1. 静态变量和全局变量在lambda表达式中直接使用

#include <iostream>
int a = 1;
int main()
{
    int b = 2;
    static int c = 3;
    auto foo = [b] { return a + b + c; };
    std::cout << foo() << std::endl;
}

        2. 按值捕获变量在lambda中不能修改。 

void test()
{
    int x = 10, y = 5;
    auto foo = [x, y] {
    x += 1; // 编译失败,无法改变x
    y += 2; // 编译失败,无法改变y
    return x * y;
    };
    std::cout << foo() << std::endl;
}

        3. mutable的作用是可以修改按值捕获的变量

void test()
{
    int x = 10, y = 5;
    auto foo = [x, y] () mutable {
    x += 1; 
    y += 2; 
    return x * y;
    };
    std::cout << foo() << std::endl;
}

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑不溜秋的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值