C++隱式推導(dǎo)-auto關(guān)鍵詞

總述

C++中有一個(gè)關(guān)鍵字愤估,它不進(jìn)行顯式聲明挨稿,而進(jìn)行隱式推導(dǎo),auto可以在聲明變量時(shí)根據(jù)變量初始值的類型自動(dòng)為此變量選擇匹配的類型水由。C++語(yǔ)言類似的關(guān)鍵字還有decltype。

如何評(píng)價(jià) C++ 11 auto 關(guān)鍵字赛蔫?既然auto關(guān)鍵字可以用來(lái)做類型推斷砂客,使得C++在使用auto時(shí)更像是在用動(dòng)態(tài)類型語(yǔ)言。

既然auto能幫我們偷很多懶呵恢,那平時(shí)寫C++還有必要像之前一樣顯式聲明類型嗎鞠值?最佳實(shí)踐是如何,應(yīng)當(dāng)徹底改變之前的C++習(xí)慣盡可能大量地使用auto渗钉,還是在什么樣的特定的情形下才使用auto彤恶?

知乎問(wèn)答

知乎上有這么一條問(wèn)題很有意思,大家對(duì)于auto使用有很多的討論鳄橘,接下來(lái)我就一點(diǎn)點(diǎn)解開(kāi)auto的神秘面紗声离,讓大家來(lái)進(jìn)行評(píng)判auto。

作者:良知猶存

轉(zhuǎn)載授權(quán)以及圍觀:歡迎添加微信公眾號(hào):Conscience_Remains

先上一段小代碼:

auto f = 3.14;? //double

auto s("hello");? //const char*

auto z = new auto(9);? //int *

從上面可以看到瘫怜,我們聲明不需要定義顯性的類型抵恋,只需要用auto定義進(jìn)行自動(dòng)推導(dǎo)即可。

? ? 編程時(shí)經(jīng)常需要把表達(dá)式的值賦給變量宝磨,這就要求聲明變量的時(shí)候弧关,我們可以清楚的知道表達(dá)式的類型。然而很多時(shí)候名字空間唤锉、模板成為類型的一部分世囊,導(dǎo)致了程序員在復(fù)雜類型的初始化聲明中如履薄冰,所以C++11中引入了auto類型說(shuō)明符窿祥,用它就可以讓編譯器替我們分析表達(dá)式所屬的類型株憾。

簡(jiǎn)潔之道:

舉一個(gè)經(jīng)常使用的容器的iterator的例子:

#include?<string>??

#include <vector>?

void test(std::vector<std::string>&vs)?

{?

? ? std::vector<std::string>::iterator i=vs.begin();?

????for(;i<vs.end();i++)??{?}?

}??

用std::vector<std::string>::iterator定義變量i,在c++中是一個(gè)安全可靠的方法,但是名字也是很長(zhǎng)嗤瞎,如果用auto的話墙歪,代碼會(huì)簡(jiǎn)潔很多。如下:???????

#include <string>

#include <vector>

void test(std::vector<std::string>&vs)

{

??for(??auto?i=vs.begin();;i<vs.end();i++){

??}

}

誤區(qū)之所:

雖然auto可以自動(dòng)推導(dǎo)類型贝奇,但是定義的規(guī)則我們還需要注意虹菲。

auto i=0,*p=& i; //正確

auto?y;?//錯(cuò)誤,auto定義的變量必須有初始值

auto sz=0,pi=3.14;//錯(cuò)誤掉瞳,sz和pi的類型不一樣

c++11引入了auto類型說(shuō)明符毕源,auto讓編譯器通過(guò)初始值來(lái)推算變量的類型,所以auto定義的變量必須有初始值陕习。 詳細(xì)解釋一下:

? ? 這里的y霎褐,我們使用auto關(guān)鍵字來(lái)聲明,但是不立即對(duì)其進(jìn)行定義该镣,此時(shí)編譯器則會(huì)報(bào)錯(cuò)冻璃。這跟通過(guò)其他關(guān)鍵字(除去引用類型的關(guān)鍵字)先聲明后定義的變量的使用規(guī)則是不同的。auto聲明的變量必須被初始化损合,以使編譯器能夠從其初始化表達(dá)式中推導(dǎo)出其類型省艳。這個(gè)意義上,auto并非一種類型聲明塌忽,而是一個(gè)類型聲明時(shí)的“占位符”拍埠,編譯器在便已是親會(huì)將suto替代為變量實(shí)際的類型失驶。

? ? 使用auto也能在一條語(yǔ)句中聲明多個(gè)變量土居,因?yàn)橐粭l聲明語(yǔ)句只能有一個(gè)基本數(shù)據(jù)類型,所以該語(yǔ)句中所有變量的初始基本數(shù)據(jù)類型都必須一樣嬉探。

但是擦耀,上面這么簡(jiǎn)單的變量聲明類型,不建議用auto關(guān)鍵字涩堤,而是應(yīng)更清晰地直接寫出其類型眷蜓。

? ? 因?yàn)閍uto關(guān)鍵字更適用于類型冗長(zhǎng)復(fù)雜、變量使用范圍專一時(shí)胎围,使程序更清晰易讀吁系。例如上面的簡(jiǎn)潔之道中的例子那樣復(fù)雜的表達(dá)。

使用之途:

1.范圍for循環(huán)中用auto

for?(auto?&?i?:?list){//對(duì)于list中的數(shù)據(jù)來(lái)說(shuō)白魂,i是一個(gè)引用汽纤,for里面的賦值語(yǔ)句將會(huì)改變list中數(shù)據(jù)

? }

? for (auto? i : list)

? }

2.保存lambda表達(dá)式類型的變量聲明:

auto ptr = [](double x){return x*x;};//類型為std::function<double(double)>函數(shù)對(duì)象

3.函數(shù)的返回類型(auto在C++14可以作為函數(shù)返回類型)

template<class T,class U>

auto?fun(T x,U y)

{

? return x*y;

}

這就是我分享的auto關(guān)鍵詞,如果大家有什么更好的思路福荸,歡迎分享交流哈蕴坪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子背传,更是在濱河造成了極大的恐慌呆瞻,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件径玖,死亡現(xiàn)場(chǎng)離奇詭異痴脾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)挺狰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門明郭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人丰泊,你說(shuō)我怎么就攤上這事薯定。” “怎么了瞳购?”我有些...
    開(kāi)封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵话侄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我学赛,道長(zhǎng)年堆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任盏浇,我火速辦了婚禮变丧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绢掰。我一直安慰自己痒蓬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布滴劲。 她就那樣靜靜地躺著攻晒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪班挖。 梳的紋絲不亂的頭發(fā)上鲁捏,一...
    開(kāi)封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音萧芙,去河邊找鬼给梅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛双揪,可吹牛的內(nèi)容都是我干的动羽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盟榴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼曹质!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤羽德,失蹤者是張志新(化名)和其女友劉穎几莽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宅静,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡章蚣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姨夹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纤垂。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖磷账,靈堂內(nèi)的尸體忽然破棺而出峭沦,到底是詐尸還是另有隱情,我是刑警寧澤逃糟,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布吼鱼,位于F島的核電站,受9級(jí)特大地震影響绰咽,放射性物質(zhì)發(fā)生泄漏菇肃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一取募、第九天 我趴在偏房一處隱蔽的房頂上張望琐谤。 院中可真熱鬧,春花似錦玩敏、人聲如沸斗忌。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飞蹂。三九已至几苍,卻和暖如春翻屈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妻坝。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工伸眶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刽宪。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓厘贼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親圣拄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘴秸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359