先来一个简单的例子
#includeusing namespace std; int main() { auto basic_lambda = [] {cout << "Hello Lambda" << endl; }; //定义简单的lambda表达式 basic_lambda(); //调用 }
再来一个复杂的例子
#includeusing namespace std; int main() { int x = 10; // 定义作用域内的x,方便下面的lambda捕捉 auto add_x = [x](int a) { return a + x; }; // 传值捕捉x auto multiply_x = [&x](int a) {return a * x; }; //引用捕捉x cout <
lambda 表达式定义了一个匿名函数,并且可以捕获一定范围内的变量。lambda 表达式的语法形式可简单归纳如下:[ capture ] ( params ) opt -> ret { body; };其中 capture 是捕获列表,params 是参数表,opt 是函数选项,ret 是返回值类型,body是函数体。
在上面例子二中,auto add_x = [x](int a) { return a + x; }; capture 捕获了上下文中的x因此,一个完整的 lambda 表达式看起来像这样:
auto f = [](int a) -> int { return a + 1; }; std::cout << f(1) << std::endl; // 输出: 2lambda表达式最前面的方括号提供了“闭包”功能。每当定义一个lambda表达式以后,编译器会自动生成一个 匿名类 ,并且这个类重载了()运算符,我们将其称之为闭包类型(closure type)。在运行时,这个lambda表达式会返回一个匿名的闭包实例,并且该实例是一个右值。闭包的一个强大之处在于其可以通过传值或引用的方式捕捉其封装作用域内的变量,lambda表达式前面的方括号就是用来定义捕捉模式以及变量的lambda捕捉块。
C++ 中的lambda表达式
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)