當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]C++11系列-改進(jìn)的類型推導(dǎo):auto、decltype和新的函數(shù)語(yǔ)法C++11引入了一些新的實(shí)用的類型推導(dǎo)能力,這意味著你可以花費(fèi)更少的時(shí)間去寫(xiě)那些編譯器已經(jīng)知道的東西。當(dāng)然有些時(shí)候你需要幫助編譯

C++11系列-改進(jìn)的類型推導(dǎo):auto、decltype和新的函數(shù)語(yǔ)法

C++11引入了一些新的實(shí)用的類型推導(dǎo)能力,這意味著你可以花費(fèi)更少的時(shí)間去寫(xiě)那些編譯器已經(jīng)知道的東西。當(dāng)然有些時(shí)候你需要幫助編譯器或者你的編程伙伴。但是C++11,你可以在一些乏味的東西上花更少的時(shí)間,而多去關(guān)注邏輯本身。

auto之樂(lè)

我們先快速回顧一下auto,萬(wàn)一你沒(méi)有讀第一篇C++11文章中關(guān)于auto的部分。在C++11中,如果編譯器在定義一個(gè)變量的時(shí)候可以推斷出變量的類型,不用寫(xiě)變量的類型,你只需寫(xiě)auto即可。

int?x?=?4;

現(xiàn)在可以這樣寫(xiě):

auto?x?=?4;

這當(dāng)然不是auto預(yù)期的用途!它會(huì)在模板和迭代器的配合使用中閃耀光芒:

vectorvec;
auto?itr?=?vec.iterator();

其它時(shí)候auto也會(huì)非常有用。比如,你有一些下面格式的代碼:

templatevoid
makeAndProcessObject?(const?Builder&?builder)
{
????BuiltType?val?=?builder.makeObject();
????//?do?stuff?with?val
}

上面的代碼,我們看到這里需要兩個(gè)模板參數(shù):一個(gè)是Builder對(duì)象的類型,另一個(gè)是Builder創(chuàng)建出的對(duì)象的類型。糟糕的是創(chuàng)建出的類型無(wú)法被推導(dǎo)出,所以每次你必須這樣調(diào)用:

MyObjBuilder?builder;
makeAndProcessObject(?builder?);

但是auto立即將丑陋的代碼一掃無(wú)余,當(dāng)Builder創(chuàng)建對(duì)象時(shí)不用寫(xiě)特殊代碼了,你可以讓C++幫你做:

templatevoid
makeAndProcessObject?(const?Builder&?builder)
{
????auto?val?=?builder.makeObject();
????//?do?stuff?with?val
}

現(xiàn)在你僅需一個(gè)模板參數(shù),而且這個(gè)參數(shù)可以在函數(shù)調(diào)用的時(shí)候輕松推導(dǎo):

MyObjBuilder?builder;
makeAndProcessObject(?builder?);

這樣更易調(diào)用了,并且沒(méi)丟失可讀性,卻更清晰了。

decltype和新的返回值語(yǔ)法

現(xiàn)在你可能會(huì)說(shuō)auto就這樣嗎,假如我想返回Builder創(chuàng)建的對(duì)象怎么辦?我還是需要提供一個(gè)模板參數(shù)作為返回值的類型。好!這充分證明了標(biāo)準(zhǔn)委員有一群聰明的家伙,對(duì)這個(gè)問(wèn)題他們?cè)缦牒昧艘粋€(gè)完美的解決方案。這個(gè)方案由兩部分組成:decltype和新的返回值語(yǔ)法。

新的返回值語(yǔ)法

讓我們講一下新的返回值語(yǔ)法,這個(gè)語(yǔ)法還能看到auto的另一個(gè)用處。在以前版本的C和C++中,返回值的類型必須寫(xiě)在函數(shù)的前面:

int?multiply(int?x,?int?y);

在C++11中,你可以把返回類型放在函數(shù)聲明的后面,用auto代替前面的返回類型,像這樣:

auto?multiply(int?x,?int?y)?->?int;

但是為什么我要這樣用?讓我們看一個(gè)證明這個(gè)語(yǔ)法好處的例子。一個(gè)包含枚舉的類:

class?Person
{
public:
????enum?PersonType?{?ADULT,?CHILD,?SENIOR?};
????void?setPersonType?(PersonType?person_type);
????PersonType?getPersonType?();
private:
????PersonType?_person_type;
};

我們寫(xiě)了一個(gè)簡(jiǎn)單的類,里面有一個(gè)類型PersonType表明Person是小孩、成人和老人。不做特殊考慮,我們定義這些成員方法時(shí)會(huì)發(fā)生什么? 第一個(gè)設(shè)置方法,很簡(jiǎn)單,你可以使用枚舉類型PersonType而不會(huì)有錯(cuò)誤:

void?Person::setPersonType?(PersonType?person_type)
{
????_person_type?=?person_type;
}

而第二個(gè)方法卻是一團(tuán)糟。簡(jiǎn)單的代碼卻編譯不過(guò):

//?編譯器不知道PersonType是什么,因?yàn)镻ersonType會(huì)在Person類之外使用
PersonType?Person::getPersonType?()
{
????return?_person_type;
}

你必須要這樣寫(xiě),才能使返回值正常工作

Person::PersonType?Person::getPersonType?()
{
????return?_person_type;
}

這可能不算大問(wèn)題,不過(guò)會(huì)容易出錯(cuò),尤其是牽連進(jìn)模板的時(shí)候。

這就是新的返回值語(yǔ)法引進(jìn)的原因。因?yàn)楹瘮?shù)的返回值出現(xiàn)在函數(shù)的最后,而不是前面,你不需要補(bǔ)全類作用域。當(dāng)編譯器解析到返回值的時(shí)候,它已經(jīng)知道返回值屬于Person類,所以它也知道PersonType是什么。

auto?Person::getPersonType?()?->?PersonType
{
????return?_person_type;
}

好,這確實(shí)不錯(cuò),但它真的能幫助我們什么嗎?我們還不能使用新的返回值語(yǔ)法去解決我們之前的問(wèn)題,我們能嗎?不能,讓我們介紹新的概念:decltype。

decltype

decltype是auto的反面兄弟。auto讓你聲明了一個(gè)指定類型的變量,decltype讓你從一個(gè)變量(或表達(dá)式)中得到類型。我說(shuō)的是什么?

int?x?=?3;
decltype(x)?y?=?x;?//?相當(dāng)于?auto?y?=?x;

可以對(duì)基本上任何類型使用decltype,包括函數(shù)的返回值。嗯,聽(tīng)起來(lái)像個(gè)熟悉的問(wèn)題,假如我們這樣寫(xiě):

decltype(?builder.makeObject()?)

我們將得到makeObject的返回值類型,這能讓我們指定makeAndProcessObject的返回類型。我們可以整合進(jìn)新的返回值語(yǔ)法:

templateauto
makeAndProcessObject?(const?Builder&?builder)?->?decltype(?builder.makeObject()?)
{
????auto?val?=?builder.makeObject();
????//?do?stuff?with?val
????return?val;
}

這僅適用于新的返回值語(yǔ)法,因?yàn)榕f的語(yǔ)法下,我們?cè)诼暶骱瘮?shù)返回值的時(shí)候無(wú)法引用函數(shù)參數(shù),而新語(yǔ)法,所有的參數(shù)都是可訪問(wèn)的。

auto:引用、指針和常量

下面要確定的一個(gè)問(wèn)題是auto如何處理引用:

int&?foo();

auto?bar?=?foo();?//?int&?or?int?

答案是在C++11中,auto處理引用時(shí)默認(rèn)是值類型,所以下面的代碼bar是int。不過(guò)你可以指定&作為修飾符強(qiáng)制它作為引用:

int&?foo();

auto?bar?=?foo();?//?int
auto&?baz?=?foo();?//?int&

不過(guò),假如你有一個(gè)指針auto則自動(dòng)獲取指針類型:

int*?foo();

auto?p_bar?=?foo();?//?int*

但是你也可以顯式指定表明變量是一個(gè)指針:

int*?foo();
auto?*p_baz?=?foo();?//?int*

當(dāng)處理引用時(shí),你一樣可以標(biāo)記const,如果需要的話:

int&?foo();

const?auto&?baz?=?foo();?//?const?int&

或者指針:

int*?foo();
const?int*?const_foo();
const?auto*?p_bar?=?foo();?//?const?int*
auto?p_bar?=?const_foo();?//?const?int*

所有這些都很自然,并且這遵循C++模板中類型推導(dǎo)的規(guī)則。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉