C++ lambda表达式

        看了书是真的记不住,就打算写个笔记,没想到写的还挺多,就发个博客吧。冲着笔记写的,写的不是很好。中途看书不是很理解,感觉这个写的挺好(http://blog.jobbole.com/104548/)如果时间多的话,或者看这个还不太懂得的话再看我的把...lambda不难稍微看看你一定会懂的。
        我现在就是不太清楚为什么非要弄这么个奇怪的玩意出来,直接用函数不就挺好的吗...就算是当做参数时使用也比函数简单不了多少...非得要搞这种幺蛾子为难码农(这里码农并非指程序员)....
         什么时候才能精通C艹啊!(假装这里有有个滑稽笑哭脸)....
        到处都是... ... ... ... ...............................................................
lambda表达式
auto f= [捕获的链表](参数链表)-> 返回值 {函数体}

捕获列表

1.捕获链表可以捕获值也可以捕获引用
2.捕获已存在的局部变量
3.捕获值在声明的同时进行,之后在函数内修改该变量不会影响lambda表达式捕获的值,如果想使用修改就捕获引用。
int main()
{
int s=10;
auto f=[&s](){Print(cout<<"lamb "<<s);};//捕获引用和值两个有不同结果。
s=100;
f();
}
4.上面说的都是显示的列出捕获链表,是显式的捕获,还有隐式捕获,他会根据表达式函数体自动进行捕获,当然有值和引用捕获两种。
auto f=[=](){Print(cout<<"lamb "<<s);};//值捕获
auto f=[&](){Print(cout<<"lamb "<<s);};//引用捕获
5.如果我想大多数用值捕获,有的用引用捕获,或者相反。我们有混合捕获。
auto f=[=,&b](){Print(cout<<"lamb "<<s<<b++);};//混合捕获必须把隐式捕获放在第一个
auto f=[&,b](){Print(cout<<"lamb "<<s<<b++);};//混合捕获必须把隐式捕获放在第一个

6.上面说了捕获的值不可以被修改,如果要在lambda里面修改,则需要加上mutable这个关键子。注意捕获的值只在lambda里面被修该,他不影响lambda外面的变量。
int main()
{
int a=10;
auto f=[a]()mutable{//不加mutable,下面的a++就会报错;
cout<<"aaaa"<<endl;
a++;
cout<<a<<endl;
};
f();
cout<<a;//只在lambda里面修改的a不影响lambda里的a,这里仍然是10;
}
7.如果引用的是一个const 变量,当然就无法修改。
const int a=10;
auto f=[&a](){a++;};//错误的a,引用的是一个常量无法修改。

返回类型
    1.如果函数体只有一条return语句,他会自动推断返回值的类型,可以不去显式指定。
    2.如果除了return,还有其他语句,该表达式返回默认void。如果你不显示指定返回值类型,但你有返值他就会报错。
    3.现在编译器成精了,如果你有其他语句,而且你没有显式指定。编译器会给你自动给你判断返回值类型,所以上面那条规则说会报错但是你试了一下有时候并不会报错。
    4.当然编译器能力也有限,如果你有多个return ,编译器就没法推断了,就必须自己显式指定了
auto f=[a]()->int{//必须用尾置返回类型 来定义 反回类型
if(a==10)
return 1;
else
{
return 2.0;//由于和上面那个返回类型不一样,编译器就没有办法知道你到底想干嘛,就报错,就必须显式指定返回类型
//return 2;//如果这里return的是2,和上面那个返回类型一样,编译器就大胆的猜测知道你要返回int型,不显式指定也不会报错。但是这是编译器的猜测,如果换一个胆小的编译器他不敢给你猜测,那你这里即使return2也不行(见规则2),所以个人感觉如果不是只有一条return语句,就给他加上返回值类型。更好的兼容性吧。
}
};

阅读更多
文章标签: c++ lambda
个人分类: c++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭