Fork me on GitHub

C++11 Lambda 表达式

Lambda 简单一句话概括:一个函数方法中的实现的一个临时函数。表达式是一种匿名函数,即没有函数名的函数;

通常情况下,lambda函数的语法定义为:

 

capture捕捉列表。捕捉列表总是作为lambda的开始,即出现于lambda的开始处。它是lambda的引出符(即开始标志)。编译器可以根据该“标志”来作出判断出该函数是否为lambda函数。同时“捕捉列表”能够捕捉上下文中的变量以作为lambda函数使用。

    [var] 表示值传递方式捕捉变量var

    [=] 表示值传递方式捕捉所有父作用域的变量(包括this)

    [&var] 表示引用传递捕捉变量var

    [&] 表示引用传递捕捉所有父作用域的比哪里(包括this)

    [this] 表示值传递方式捕捉当前的this指针。

    如果没有具体指定捕获列表,那么将会把所有参数按照深拷贝处理

parameters参数列表。和C/C++中的普通函数参数意义一样。该部分是可选的,意味着如果我们不需要进行参数传递时,可以连同括号“()”一起省略掉。

mutable该关键字为一个修饰符。可以省略不写,在默认的情况下,lambda函数总是返回一个const,而当我们在参数列表后面注明了“mutable”关键字之后,则可以取消其常量性质。若在lambda中使用了mutable修饰符,则“参数列表”是不可省略掉的(即使是参数为空)。

return-type函数的返回值类型。和C/C++中的普通函数返回值类型的性质一样。主要目的是用来追踪lambda函数(有返回值情况下)的返回类型。若lambda函数不需要返回值,则可以直接将这部分省略掉,或者返回 void。

statement函数体。在该函数体中,除了可以使用参数列表中的变量外,还可以使用所有捕获到的变量(即[capture] 中的变量)。

 

 1 int c_c = 10;
 2 
 3 int main()
 4 {
 5     int c = 3;
 6     auto f = [ = , &c ](int a, int b)->int { c = 5; return a + b + c + c_c; };
 7     
 8     std::cout << "function: " << f(1, 2) << "c = " << c << std::endl;
 9     
10     return 0;
11 }

1. 捕获可以指定变量的捕获方式,c引用方式捕获

2. 只能捕获当前方法作用域之内的变量,以及全局变量

3. 可以修改捕获到的所有值

 

posted @ 2023-05-06 00:48  索智源  阅读(38)  评论(0编辑  收藏  举报