bosthhe1 / cpushpush

0 stars 0 forks source link

lambda表达式 #43

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

lambda表达式实际上是编译器在底层替换成了仿函数 lamdba的书写形式是auto fun1 = [ ] ()->int{return a+b;}; 这里是比较完整的lambda表达式 image

bosthhe1 commented 1 year ago

我们再写lambda表达式的时候,一般不会写函数的返回值,而是自动推导,所以可以写成[a,b](int c){return a+b;};lambda表达式在如果没有传递参数,(int c)也不会写,写成auto func1= [a,b]{return a+b;};,这就是一条加法的lambda表达式

bosthhe1 commented 1 year ago

lambda表达式中 '[ ]'中捕捉方式可以有很多种 [var]:表示值传递方式捕捉变量var [&var]:表示引用传递捕捉变量var [=]:表示值传递方式捕获所有父作用域中的变量(包括this) [&]:表示引用传递捕捉所有父作用域中的变量(包括this) [this]:表示值传递方式捕捉当前的this指针 这些符号可以混用如:[ = ,&a,&b]表示,捕捉所以变量,但是a,b变量传引用捕捉 但是需要注意的是,同一新式的同一变量不可重复捕捉如[ = , a],"="代表传值的方式捕捉所有变量,a表示传值捕捉a变量,但是" = "已经捕捉所有传值的变量了,a又去传值捕捉,这里就重复捕捉了,编译器不通过,[ & ,&a ],这样也不能通过 捕捉只能捕捉当前作用域或者全局域的变量

bosthhe1 commented 1 year ago

mutable的使用 在lambda表达式中,以传值方式的参数都是自带const属性的,是不可以修改的,我们看到传值捕捉所有变量,但是对a进行修改是不可以的 image 可以加mutable取消传值变量的const性质

int main()
{
    int a = 0;
    int b = 10;
    auto f1 = [=]()mutable{a++; };//我们可以加mutable取消a的const性质,但是加了mutable就不能省略(),必须写上
    return 0;
}