C++中Lambda表达式的语法与实例

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

        概述

        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
        

        总结

        到此这篇关于C++中Lambda表达式的文章就介绍到这了,更多相关C++中Lambda表达式内容请搜索海外IDC网以前的文章或继续浏览下面的相关文章希望大家以后多多支持海外IDC网!

        【来源:自由互联、韩国大带宽服务器http://www.558idc.com/lg.html】