C++Lambda表达式详解

目录

  • 概述
  • 语法分析
    • 捕获列表
    • 关键字声明
  • 示例
    • 捕获列表按值传递
  • 总结

    概述 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表达式详解】本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

      推荐阅读