C++ lambda相关知识点

本文详细介绍了C++11引入的Lambda函数,包括其基本用法、参数传递方式(值传递、引用传递)、可变性(mutable关键字)以及与异常处理的关系。通过实例展示了Lambda如何捕获外部变量并进行操作,同时提到了C++20中Lambda与模板的结合使用,使代码更简洁高效。
摘要由CSDN通过智能技术生成

支持版本

lambda语法从c++ 11开始支持,所以要注意配置编译环境到支持的标准版本。例如用g++编译。则需要添加-std=c++11

示例命令如下

g++ -std=c++11 main.cpp

当然了你可以选择更高版本进行编译,毕竟向前兼容,例如-std=c++2a

基础用法

基础语法

[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}

简单的空匿名函数

最简单的空函数,也没有返回值。

void test() {
    const auto empty_call = []() {
        printf("empty call.\n");
    };
    empty_call();
}

全部值传递

lambda函数可见范围内的所有变量按值传递方式传入。但是不可修改,可以理解为是常量。

void test() {
    int a = 2;
    int b = 5;
    const auto empty_call = [=]() {
        printf("a = %d b = %d\n", a, b); // a = 2 b = 5
    };
    empty_call();
}

值传递且参数可变

lambda表达式可见范围内的所有变量按值传递方式传入。但是可修改,即变量。

由于是按值传递,所以即使在lambda函数内修改了变量,但是修改的只是副本。

注意由于使用了mutable修饰,所以该lambda函数不能修饰为const

void test() {
    int a = 2;
    int b = 5;
    auto empty_call = [=]() mutable {
        a = 3;
        printf("a = %d b = %d\n", a, b); // a = 3 b = 5
    };
    empty_call();
    printf("a = %d b = %d\n", a, b); // a = 2 b = 5
}

除了mutable修饰,lambda函数也和一般函数一样支持exception修饰。

全部按引用传递

lambda函数可见范围内的所有变量按引用传递方式传入。所有引用如果是变量的话可修改。
语法为在[&]

按引用传递的lambda函数可以用const修饰,并不影响引用的可写性,只有值传递的mutating才对是否可以启用const有要求。

void test() {
    int a = 2;
    int b = 5;
    const auto empty_call = [&]() {
        a = 3;
        printf("a = %d b = %d\n", a, b); // a = 3 b = 5
    };
    empty_call();
    printf("a = %d b = %d\n", a, b); // a = 3 b = 5
}

带参数及返回值

返回值用->加返回类型即可。

void test() {
    const auto call = [&](int i) -> int {
        return i * i;
    };
    int a = 5;
    int b = call(a);
    printf("sqr(%d) = %d\n", a, b); // sqr(5) = 25
}

指定参数传递

可以指定变量进行传递,且可以指定该变量是按值传递还是引用传递。

该指定操作可以和=复合执行,复合的含义是除了指定的变量,其它变量统一按值传递,例如[=, &i]

void test() {
    int i = 5;
    int k = 5;
    // 指定i按引用,k按值传递
    auto call = [&i, k]() mutable {
        i++;
        k++;
    };
    call();
    printf("i = %d k = %d\n", i, k); // i = 6 k = 5
}
void test() {
    int i = 5;
    int k = 5;
    // 指定i按引用,其它所有变量按值传递
    auto call = [=, &i]() mutable {
        i++;
        k++;
    };
    call();
    printf("i = %d k = %d\n", i, k); // i = 6 k = 5
}

lambda与模板(std::c++20起)

c++后续的新特性使得lambda支持模板,但是写起来有点略为繁琐。下面是两个比较简单的例子。

void test() {
    const auto f = [] <size_t esize> () {
        printf("size = %lu\n", esize);
    };
    f.template operator()<16>(); // size = 16
    f.template operator()<32>(); // size = 32
}
void test() {
    const auto call = []<typename T>(T a) {
        std::cout << "output: " << a << std::endl;
    };
    call("hello, world."); // output: hello, world.
    call(1); // output: 1
    call(3.14); // output: 3.14
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值