可调用对象

先记一下,以后补充,免得忘记

函数:
函数指针:
重载了函数调用运算符的类:

lambda表达式:表示一个可调用代码单元,可以理解为一个未命名的内联函数。
与任何函数类似,一个lambda有一个返回类型,一个参数列表和一个函数体。但不同的是,lambda可能定义在函数内部。
形式:[capture list](parameter list) -> return type { function body }
其中capture list(捕获列表)是一个lambda所在函数定义的局部变量的列表(通常为空);lambda必须使用尾置返回来指定返回类型。 我们可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体
如:auto f = [ ] { return 42; }
cout<< f() <

void biggies(vector<string> &words, vector<string>::size_type sz)
{
    auto wc = find_if(words.begin(),words.end(),[sz] ( const string &a)
 { return a.size() >= sz; });//输出长度大于sz的单词
    for_each( wc, words.end(), [] ( const string &s ) { cout << s << " "; } );//打印长度大于sz的单词,并每个单词后面都加上' '
}
lambda的捕获和返回:
值捕获:前提是变量可以拷贝,被捕获的变量的值是在lambda创建时拷贝,因此随后对其修改不会影响lambda内对应的值。
void fcn1()
{
    size_t v1 = 42;
    auto f = [v1] () { return v1; }
    v1 = 0;
    auto j = f();//j为42
}
引用捕获:必须确保被引用的对象在lamb时是存在的。
`void fcn1()

{

size_t v1 = 42;

auto f = [&v1] () { return ++v1; }

v1 = 0;

auto j = f();//j为0

}

`
隐式捕获:[=],[&],等等,让编译器根据lambda中的代码来推断我们要使用哪些变量。
可变lambda:默认情况下,对于一个值被拷贝的变量,lambda不会改变其值。如果我们希望能改变一个被捕获的变量的值,就必须在参数列表后加上关键字mutable:

void fcn2()
{
    size_t v1 = 42;
    auto f = [v1] () mutable { return ++v1; }
    v1 = 0;
    auto j = f();//j为43
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值