網(wǎng)站首頁 編程語言 正文
auto類型推導(dǎo)
C++舊標(biāo)準(zhǔn):
具有自動(dòng)存儲(chǔ)的局部變量
auto int i = 0 //C++98
實(shí)際上我們一般不這樣寫,因?yàn)榉莝tatic變量默認(rèn)就是具有自動(dòng)存儲(chǔ)的局部變量
C++11:
讓編譯器自動(dòng)推斷出這個(gè)變量的類型,而不需要顯式指定類型
auto基本用法
演示:
auto x = 5 //x --> int auto pi = new auto(1) //pi --> int* const auto *v = &x, u = 6 //v --> const int* 、 u --> const int static auto y = 0.0 //y --> double int x = 0 auto * a = &x //a --> int* , auto為int auto b = &x //b --> int* , auto 為 int* auto c = x //c --> int& , auto為int auto d = c //d --> int , auto為int const auto e = x //e --> const int auto f = e //f --> int const auto& g = x //g --> const int& auto& h = g //h --> const int&
上面就是通常會(huì)出現(xiàn)的所有情況,其實(shí)可以類比模板參數(shù)自動(dòng)推導(dǎo)
auto 不能用于函數(shù)參數(shù)
auto 推導(dǎo)規(guī)則
黃金法則:
- 當(dāng)不聲明為指針或引用時(shí),auto的推到結(jié)果和初始化表達(dá)式拋棄引用和cv限定符(cosnt 和 volatile,下同)后類型一致
- 當(dāng)聲明為指針或引用時(shí),auto的推到結(jié)果將保持初始化表達(dá)式的cv屬性
auto 的限制
- 不能用于函數(shù)參數(shù)
- 不支持非靜態(tài)成員變量的初始化
- main函數(shù)中auto不會(huì)被推導(dǎo)為數(shù)組類型,而是指針類型
auto 適用場(chǎng)景
場(chǎng)景一:for循環(huán)中用來遍歷容器
for(auto it = resultMap.begin(); it != resultMap.end(); ++i){ //do something }
場(chǎng)景二:用于不知道如何定義變量,多與泛型有關(guān)
class Foo{ public: static int get(void) { return 0; } }; class Bar{ public: static const char* get(void) { return "0"; } }; template<class A> void func(void) { auto val = A::get(); // ... }
decltype 類型推導(dǎo)
decltype( exp )
exp 表示一個(gè)表達(dá)式
從格式上來看,decltype像sizeof ,但其用來在編譯時(shí)推導(dǎo)出一個(gè)表達(dá)式的類型
decltype 基本用法
int x = 0 decltype(x) y = 1 //y -> int decltype(x + y) z = 0 //z -> int const int& i = x decltype(i) j = y //j -> const int & cosnt decltype(z) *p = &z //*p -> const int, p -> const int * decltype(z) * pi = &z //*pi -> int , pi -> int* decltype(pi) * pp = &pi //*pp -> int * ,pp -> int **
decltype和&結(jié)合的推導(dǎo)結(jié)果,與引用折疊規(guī)則有關(guān),將在本系列后續(xù)中詳細(xì)講解
decltype 推導(dǎo)規(guī)則
黃金法則:
- exp是標(biāo)識(shí)符、類訪問表達(dá)式,
decltype
(exp) 和exp的類型一致 - exp是寒素調(diào)用,
decltype
(exp) 和返回值 的類型一致 - 其他情況,若exp是個(gè)左值,則 ecltype(exp) 是exp類型的左值引用,否則和exp類型一致
decltype 適用場(chǎng)景
decltype適用于泛型相關(guān)
場(chǎng)景一:
標(biāo)準(zhǔn)庫中有些類型的定義
typedef decltype(nullptr) nullptr_t typedef decltype(sizeof(0)) size_t `
場(chǎng)景二:
通過變量表達(dá)式抽取變量類型實(shí)現(xiàn)簡(jiǎn)寫
vector<int> v; decltype(v):value_type i = 0
場(chǎng)景三:
template<class ContainerT> class Foo { decltype(ContainerT().begin()) it_; public: void func(ContarinerT& container) { it_ = container.begin(); } // ... }
auto 和 decltype結(jié)合——返回類型后置
即通過兩個(gè)結(jié)合起來,使得語法更加靈活便捷
int & foo(int& i); float foo(float& f) template<typename T> auto fun(T& val) -> decltype(foo(val)) { return foo(val); }
小結(jié)
auto
和decltype
的出現(xiàn)不僅彌補(bǔ)了C++舊版標(biāo)準(zhǔn)的不足,也大大解放了開發(fā)人員的生產(chǎn)力,提升了效率。但是我們?cè)谑褂玫臅r(shí)候仍然需要注意,不能濫用,否則會(huì)出現(xiàn)我們期望得到的類型和最終程序的類型不一致,導(dǎo)致一些意想不到的BUG,給我維護(hù)增加了成本,適用和巧用才是正解!
原文鏈接:https://blog.51cto.com/u_14156525/5235378
相關(guān)推薦
- 2022-09-17 python?pandas處理excel表格數(shù)據(jù)的常用方法總結(jié)_python
- 2022-08-28 配置zabbix監(jiān)控nginx狀態(tài),監(jiān)控華為路由器
- 2022-06-18 python使用Random隨機(jī)生成列表的方法實(shí)例_python
- 2022-09-01 一文搞懂Scrapy與MongoDB交互過程_MongoDB
- 2022-09-04 C#線程委托BeginInvoke與EndInvoke的用法_C#教程
- 2022-11-16 詳解Python中range()與xrange()的區(qū)別_python
- 2022-07-28 Android?EventBus粘性事件實(shí)現(xiàn)機(jī)制探究_Android
- 2022-09-29 基于Python3編寫一個(gè)GUI翻譯器_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支