lambda表达式

mac2024-03-18  25

lambda表达式,c++11新特性之一,使用起来太方便了,这里简单提炼总结下: 1、可调用的

对于一个对象(或表达式,本质还是对象),如果可以对其使用调用运算符,则称它是可调用的;

2、可调用对象

函数函数指针重载了函数调用运算符的类lambda表达式(lambda expression)

3、lambda表达式 lambda表达式由捕获列表、参数列表、返回值类型、函数体构成:

捕获列表:

lambda所在函数中定义的局部变量的列表;只用于局部非static变量,可以直接使用局部static变量;捕获方式有:值捕获、引用捕获(显式捕获、隐式捕获、混合捕获);值捕获:在lambda创建时拷贝,而不是调用时拷贝;引用捕获:当以引用方式捕获一个变量时,必须保证在执行lambda时变量是存在的;隐世捕获:可以使用 =、& 来让编译器根据lambda体中代码推断我们要使用哪些变量;混合捕获:捕获列表中第一个元素必须为 =或& (即隐式捕获开头),且显示捕获必须与隐式捕获类型不同(不能同为值捕获或同为引用捕获);尽量避免捕获指针或引用;

参数列表:

与普通函数不同,lambda不能有默认参数,即,lambda调用的实参数目永远与形参数目相等;

返回类型:

与普通函数不同,必须使用尾置返回;

函数体:

如果lamdba函数体包含任何return语句之外的内容,且未指定返回类型,则返回类型为void;

注意:

可以忽略参数列表和返回类型,但必须包含捕获列表和函数体;

4、使用:

如果lambda表达式捕获列表为空,一般可以用一个函数替代它;对于那种只在一两个地方上使用的简单操作,lambda表达式是最有用的;如果在很多地方需要使用相同的操作,定义一个函数更好;如果一个操作需要很多条语句才能完成,同样定义一个函数更好;

5、参数绑定: 判断字符串长度是否大于指定值,我们可以写一个函数:

bool longer(string str, int val);

但是这个函数无法作为可调用对象传递给find_if函数的comp参数,真的只能到此为止了吗?没有,接着看: bind函数:定义在头文件functional中,可以看作为一个通用函数适配器,它接收一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表(读起来太抽象了吧!)。其一般形式为:

auto newcallable = bind(callable, arg_list);

//待续

最新回复(0)