本文共 1675 字,大约阅读时间需要 5 分钟。
C++11中的Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。
Lambda表达式一般都是从方括号[]开始,然后结束于花括号{},主要包括五个部分:
常见几种Lambda表达式形式:
表达式 | |
---|---|
[ capture ] ( params ) mutable exception attribute -> ret { body } | (1) |
[ capture ] ( params ) -> ret { body } | (2) |
[ capture ] ( params ) { body } | (3) |
[ capture ] { body } | (4) |
void f(…){}
);f(){}
);如在sort函数中应用Lambda表达式:
std::sort(x, x + N, // Lambda expression begins [](float a, float b) { return std::abs(a) < std::abs(b); });
对于Lambda表达式,编译器会自动生成一个匿名类(重载()运算符
),称为闭包类型(closure type);在运行时,就返回这个匿名闭包类型的实例。闭包的一个强大之处是其可以通过传值或者引用的方式捕获其当前作用域内的变量,前面方括号就是用来定义捕获模式以及变量的,因此又将其称为Lambda捕获块。
Capture
是传递给闭包函数对象类的构造函数的:只能是那些Lambda表达式所在作用范围内可见的局部变量及其所在类的this指针。
注意:Capture并不能延长其捕获变量的生命周期,因此只捕获真正所需的变量,且避免悬挂引用的出现(在调用Lambda表达式时,引用变量因超出其声明域,而变的无效)。
默认情况下,使用值方式捕获的变量是不允许改变的(类似const成员变量),在闭包对象内永远保存的是其最初捕获时的值。若要对捕获的值进行修改,则需要使用mutable修饰,修饰后:
如下所示:每次调用fun时都会累加fun对象内部的Count,但是外部的nCount一直保持原来的值(10)。
int nCount = 10;auto fun = [nCount]()mutable { ++nCount; cout << "In: " << nCount << endl;};fun();fun();cout << "Out: " << nCount << endl;// In: 11// In: 12// Out: 10
转载地址:http://ugnlf.baihongyu.com/