C++Lambda表达式详解

编辑: admin 分类: c#语言 发布时间: 2021-12-12 来源:互联网
目录
  • 概述
  • 语法分析
    • 捕获列表
    • 关键字声明
  • 示例
    • 捕获列表按值传递
  • 总结

    概述

    C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下:

    [捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
    //计算两个值的和
    auto func = [](int a, int b) -> int{return a+b;};
    //当返回值的类型是确定时,可以忽略返回值
    auto func = [](int a, int b){return a + b;};
    //调用
    int sum = func(1, 3);

    语法分析

    捕获列表

    Lambda 表达式相当于一个类,那么捕获列表就是传递给这个类的类成员。比如:

    class Labmda
    {
    public:
        const int test;
        Labmda(int value):test(value)
        {
        }
    public:
        int run(int a, int b)
        {
            return a + b + test;
        }
    }
    int main()
    {
        int test = 10;
        auto func = Labmda(test);
        int sum = func.run(1, 3);
    }
    //使用Lambda 表达式的写法
    int main()
    {
        int test = 10;
        auto func = [test](int a, int b){return a + b + test;};
        int sum = func(1, 3);
    }

    捕获列表有以下格式:

    格式 描述 [] 不带任何参数 [=] Lambda表达式之前的局部变量,包括所在类的this,变量按值方式传递 [&] Lambda表达式之前的局部变量,包括所在类的this,变量按引用方式传递 [this] Lambda表达式所在类的this [a] Lambda表达式之前的局部变量a的值,也可以传入多个值,如[a , b] [&a] Lambda表达式之前的局部变量a的引用

    关键字声明

    关键字声明一般都很少用到,也不建议随便使用,可以忽略不计。

    mutable

    当捕获列表以值的方式传递时有效,加上此关键字后,可以修改Lambda类成员(带const修饰符)。比如:

    int test = 10;
    //编译报错,test成员不能修改
    auto func = [test](int a, int b){test = 8; return a + b + test;}; 
    //编译正常
    auto func = [test](int a, int b)mutable {test = 8; return a + b + test;}; 

    这里需要注意的是:Lambda类成员test修改之后,并不会改变外部int test的值。

    exception

    exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)

    示例

    捕获列表按值传递

    int test = 10;
    auto func = [=](int a, int b){return a + b + test;};
    auto func2 = [test](int a, int b){return a + b + test;};
    int sum = func(1, 3); //sum等于14

    这里需要注意的是func表达式中test的值只更新到表达式之前:

    int test = 10;
    auto func = [=](int a, int b){return a + b + test;};
    test = 5;
    int sum = func(1, 3); //sum还是等于14

    捕获列表按引用传递

    int test = 10;
    auto func = [&](int a, int b){test = 5; return a + b + test;};
    auto func2 = [&test](int a, int b){test = 5; return a + b + test;};
    int sum = func(1, 3); //sum等于9,test等于5

    这里func表达式中test的值就能随时更新:

    int test = 10;
    auto func = [&](int a, int b){return a + b + test;};
    test = 5;
    int sum = func(1, 3); //sum等于9,test等于5

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注海外IDC网的更多内容!

    【文章出处:国外服务器 转发请说明出处】