亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++精要分析decltype的作用及用法

 更新時(shí)間:2022年05月09日 10:41:46   作者:程序猿阿諾  
decltype是C++11新增的一個(gè)關(guān)鍵字,和auto的功能一樣,用來在編譯時(shí)期進(jìn)行自動(dòng)類型推導(dǎo)。引入decltype是因?yàn)閍uto并不適用于所有的自動(dòng)類型推導(dǎo)場景,在某些特殊情況下auto用起來很不方便,甚至壓根無法使用

獲取表達(dá)式的類型

在編寫程序的過程中,我們可能會(huì)有一種需求,就是希望可以根據(jù)一個(gè)變量的類型,來定義具有相同類型的變量。例如定義int x = 0;,那么我們是否可以不使用int關(guān)鍵字,僅使用x就定義一個(gè)新的整型變量y呢?

答案是可以的,C++11新增的decltype關(guān)鍵字就是干這個(gè)用的。上述需求用代碼實(shí)現(xiàn)如下:

int x = 0;
decltype(x) y = 2; // y的類型為int

decltype是在編譯期用來推導(dǎo)表達(dá)式類型的。其語法格式為:decltype(expression)。大家可以看到,decltype是可以對一個(gè)表達(dá)式取類型的,并不僅是單個(gè)的變量。所以,把形式再擴(kuò)展一下:

int x = 0;
decltype(x) y = 2;
decltype(x + y) z = 3; // z的類型為int

到這一步,相信大家已經(jīng)可以基本掌握其特性,在工作中能運(yùn)用了。當(dāng)然,僅知道這些還是不夠的,作為C++程序員怎么能停下探索的腳步呢。

推導(dǎo)規(guī)則

decltype的推導(dǎo)規(guī)則,是面試中最容易挖坑的地方。你要是不信,那就先回答下面這些問題吧:

const int func_one();
decltype(func_one()) a1 = 0; // a1是什么類型?
struct TestData { int x;};
cosnt TestData b_node = TestData();
decltype(b_node.x) b1 = 0; // b1是什么類型?
decltype((b_node.x)) b2 = b1; // b2是什么類型?
int n = 0, m = 0;
decltype(n + m) c1 = 0; // c1是什么類型?
decltype(n += m) c2 = c1; // c2是什么類型?

注釋中有五個(gè)問題,如果你全都答對而且不是蒙的,那請開班授課吧,我會(huì)第一個(gè)報(bào)名。先公布一下答案,看看自己答對了多少吧。

a1: int
b1: int
b2: const int &
c1: int 
c2: int &

如果這個(gè)答案讓你覺得有些暈頭轉(zhuǎn)向,不要緊,先來看下規(guī)則描述吧:

  1. 如果expression表達(dá)式是標(biāo)識符、類訪問表達(dá)式,decltype(exp)和exp的類型一致;
  2. 如果expression是函數(shù)調(diào)用,則decltype(exp)和返回值的類型一致;
  3. 其他情況,如果expression是一個(gè)左值,則decltype(exp)是exp類型的左值引用,否則和exp類型一致。

現(xiàn)在,將規(guī)則理解之后,再看一遍代碼和答案,是否找到規(guī)律了呢?相信在面試中遇到這樣的問題,你已經(jīng)可以應(yīng)對自如了。

返回類型后置

在說明decltype的一個(gè)高級用法之前,我們先了解C++11的一個(gè)新特性,就是函數(shù)返回類型后置。與之相對的,就是返回類型前置,這是我們最熟悉的函數(shù)聲明格式。例如:int foo();

而返回類型后置的示例如下:

auto foo() -> int {
    return 0;
}

在上面的代碼中,auto關(guān)鍵字是一個(gè)占位符,int是其實(shí)際返回類型。初看起來,后置聲明與前置聲明在功能上是一樣的,那它難道是一個(gè)多余的設(shè)計(jì)嗎?它當(dāng)然自有用武之地。

在需要返回比較復(fù)雜的類型時(shí),使用后置式聲明可以簡化代碼并使其可讀性更好。例如要返回的類型是函數(shù)指針,前置式聲明就必須先用typedef進(jìn)行預(yù)定義,否則語法不允許。而后置式聲明則可以直接實(shí)現(xiàn),無需預(yù)定義,如下代碼所示。

int exam(bool b) {
    int ret = -1;
    if (b) {
        ret = 0;
    }
    else if (!b) {
        ret = 1;
    }
    return ret;
}
auto foo() -> int(*)(bool) {
    return exam;
}
int main() {
    auto fn = foo();
    cout << fn(true) << endl;
    cout << fn(false) << endl;
}

高級用法

現(xiàn)在正式介紹decltype與函數(shù)返回類型后置相結(jié)合,在模板編程中的用法,就是用于推導(dǎo)函數(shù)模板的返回類型。之所以將此歸為高級用法,也是因?yàn)槟0逶贑++中雖然功能強(qiáng)大,但屬實(shí)復(fù)雜不易理解。一般是編寫基礎(chǔ)功能庫或是算法庫時(shí),使用到模板的特性。

先看一段示例代碼:

template<class T1, class T2>
auto sum(T1 t1, T2 t2) -> decltype(t1 + t2) {
    return t1 + t2;
}
int main() {
    auto ret = sum(4.6, 123);
    cout << ret << endl;
}

其精髓之處,就在于可以靈活支持T1與T2不同類型的組合,而不必為每種返回類型都去寫一個(gè)實(shí)現(xiàn)。例如int+int, double+int, string+string等各種組合情況。

但如果是把decltype(t1 + t2)以前置寫法替換auto,則會(huì)產(chǎn)生編譯錯(cuò)誤。道理很簡單,編譯器對t1+t2的參數(shù)類型還一無所知,只有在解析到返回值時(shí),才能最終確定函數(shù)的返回類型,這就是decltype加上函數(shù)返回類型后置在模板編程中的妙用。

到此這篇關(guān)于C++精要分析decltype的作用及用法的文章就介紹到這了,更多相關(guān)C++ decltype內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中string使用+號與int拼接方式

    C++中string使用+號與int拼接方式

    這篇文章主要介紹了C++中string使用+號與int拼接方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++ 十進(jìn)制轉(zhuǎn)換為二進(jìn)制的實(shí)例代碼

    C++ 十進(jìn)制轉(zhuǎn)換為二進(jìn)制的實(shí)例代碼

    這篇文章介紹了C++ 十進(jìn)制轉(zhuǎn)換為二進(jìn)制的實(shí)例代碼,有需要的朋友可以參考一下
    2013-10-10
  • C語言實(shí)現(xiàn)靜態(tài)版通訊錄的示例代碼

    C語言實(shí)現(xiàn)靜態(tài)版通訊錄的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言實(shí)現(xiàn)一個(gè)簡單的靜態(tài)版通訊錄,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下
    2022-08-08
  • C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法

    C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法

    今天小編就為大家分享一篇C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C++中新手容易犯的十種編程錯(cuò)誤匯總

    C++中新手容易犯的十種編程錯(cuò)誤匯總

    一段C語言代碼,在編譯、鏈接和運(yùn)行的各個(gè)階段都可能會(huì)出現(xiàn)問題,下面這篇文章主要給大家介紹了關(guān)于C++中新手容易犯的十種編程錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • C語言規(guī)避野指針的方法流程

    C語言規(guī)避野指針的方法流程

    野指針就是指針指向的不是一個(gè)有效(合法)的地址,在程序中,如果訪問野指針,可能會(huì)造成程序的崩潰,這篇文章主要介紹了C語言如何規(guī)避野指針,需要的朋友可以參考下
    2024-03-03
  • OpenGL繪制貝塞爾曲線

    OpenGL繪制貝塞爾曲線

    這篇文章主要為大家詳細(xì)介紹了OpenGL繪制貝塞爾曲線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++深入分析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形態(tài)

    C++深入分析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形態(tài)

    使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2023-01-01
  • C語言實(shí)現(xiàn)銷售管理系統(tǒng)設(shè)計(jì)

    C語言實(shí)現(xiàn)銷售管理系統(tǒng)設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)銷售管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法

    Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法

    這篇文章主要介紹了Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法,重點(diǎn)講解了圖標(biāo)的繪制技巧,需要的朋友可以參考下
    2016-04-04

最新評論