c++11新特性(4) lambda捕捉块
生活随笔
收集整理的這篇文章主要介紹了
c++11新特性(4) lambda捕捉块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
lambda表達式中的方括號成為捕捉塊,能夠在這里指定怎樣從所在的作用域中捕捉變量.
捕捉的意思是指能夠在該lambda中使用該變量.即能夠捕獲外部變量在lambda表達式內使用.
能夠使用兩種方式來捕捉所在的作用域中的全部變量.
[=]:通過值捕捉全部變量
[&]:通過引用捕捉全部變量
指定空白的捕捉塊[]表示不從所在作用域中捕捉變量.
還能夠指定捕捉哪些變量以及這些變量的捕捉方法.
[&x],僅僅通過引用捕捉x,不捕捉其它變量.
[x] 僅僅通過值捕捉x,不捕捉其它變量.
[=,&x,&y],默認值捕捉,變量x,y是例外,通過引用捕捉.
[&,x],默認引用捕捉,X通過值捕捉.
[&x,&x],非法,標識符不同意反復.
先看一個簡單的不捕捉不論什么變量的樣例.
#include <iostream>?
using namespace std;?
int main(){?
int n=6;?
int k=99;?
cout<<"In first n="<<n<<" ? k="<<k<<endl;?
[](){n=n*2,k=k+1;}();?
cout<<"now n="<<n<<" ? k="<<k<<endl;?
}
再來看看通過值捕捉
#include <iostream>?
using namespace std;?
int main(){?
int n=6;?
int k=99;?
cout<<"In first n="<<n<<" ? k="<<k<<endl;?
[=](){n=n*2,k=k+1;}();?
cout<<"now n="<<n<<" ? k="<<k<<endl;?
}
結果:
先來看看上一節中關于mutable的介紹:
mutable:(可選):假設所在作用域的變量是通過值捕捉的,那么lambda表達式的主體中就不能改動這些副本的值.這些副本默認標記為const,因此lambda表達式主體不能改動這些副本的值.假設lambda表達式標記為mutable,那么這些副本則不是const,因此主體能夠改動這些本地副本.(類似于參數傳遞中的值傳遞以及引用傳遞改動源值)
因此,假設想在lambda中改動捕獲的值,應聲明為mutable
#include <iostream>?
using namespace std;?
int main(){?
int n=6;?
int k=99;?
cout<<"In first n="<<n<<" ? k="<<k<<endl;?
[=]()mutable{n=n*2,k=k+1;}();?
cout<<"now n="<<n<<" ? k="<<k<<endl;?
}
結果:
為什么改動了之后,m和k的值都不變呢?原因是事實上通過值捕獲的都是副本來的,細致看mutable就能夠看到了.
那么通過引用捕捉呢?
關于lambda捕捉塊的介紹就到這里了.
捕捉的意思是指能夠在該lambda中使用該變量.即能夠捕獲外部變量在lambda表達式內使用.
能夠使用兩種方式來捕捉所在的作用域中的全部變量.
[=]:通過值捕捉全部變量
[&]:通過引用捕捉全部變量
指定空白的捕捉塊[]表示不從所在作用域中捕捉變量.
還能夠指定捕捉哪些變量以及這些變量的捕捉方法.
[&x],僅僅通過引用捕捉x,不捕捉其它變量.
[x] 僅僅通過值捕捉x,不捕捉其它變量.
[=,&x,&y],默認值捕捉,變量x,y是例外,通過引用捕捉.
[&,x],默認引用捕捉,X通過值捕捉.
[&x,&x],非法,標識符不同意反復.
先看一個簡單的不捕捉不論什么變量的樣例.
#include <iostream>?
using namespace std;?
int main(){?
int n=6;?
int k=99;?
cout<<"In first n="<<n<<" ? k="<<k<<endl;?
[](){n=n*2,k=k+1;}();?
cout<<"now n="<<n<<" ? k="<<k<<endl;?
}
結果
再來看看通過值捕捉
#include <iostream>?
using namespace std;?
int main(){?
int n=6;?
int k=99;?
cout<<"In first n="<<n<<" ? k="<<k<<endl;?
[=](){n=n*2,k=k+1;}();?
cout<<"now n="<<n<<" ? k="<<k<<endl;?
}
結果:
先來看看上一節中關于mutable的介紹:
mutable:(可選):假設所在作用域的變量是通過值捕捉的,那么lambda表達式的主體中就不能改動這些副本的值.這些副本默認標記為const,因此lambda表達式主體不能改動這些副本的值.假設lambda表達式標記為mutable,那么這些副本則不是const,因此主體能夠改動這些本地副本.(類似于參數傳遞中的值傳遞以及引用傳遞改動源值)
因此,假設想在lambda中改動捕獲的值,應聲明為mutable
#include <iostream>?
using namespace std;?
int main(){?
int n=6;?
int k=99;?
cout<<"In first n="<<n<<" ? k="<<k<<endl;?
[=]()mutable{n=n*2,k=k+1;}();?
cout<<"now n="<<n<<" ? k="<<k<<endl;?
}
結果:
為什么改動了之后,m和k的值都不變呢?原因是事實上通過值捕獲的都是副本來的,細致看mutable就能夠看到了.
那么通過引用捕捉呢?
#include <iostream>?
using namespace std;?
int main(){?
int n=6;?
int k=99;?
cout<<"In first n="<<n<<" ? k="<<k<<endl;?
[&]()mutable{n=n*2,k=k+1;}();?
cout<<"now n="<<n<<" ? k="<<k<<endl;?
}
關于lambda捕捉塊的介紹就到這里了.
總結
以上是生活随笔為你收集整理的c++11新特性(4) lambda捕捉块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置圆角、定向设置圆角-按钮等控件
- 下一篇: C++实现单链表