最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年05月09日 10:41:46   作者:程序猿阿諾  
decltype是C++11新增的一個關鍵字,和auto的功能一樣,用來在編譯時期進行自動類型推導。引入decltype是因為auto并不適用于所有的自動類型推導場景,在某些特殊情況下auto用起來很不方便,甚至壓根無法使用

獲取表達式的類型

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

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

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

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

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

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

推導規(guī)則

decltype的推導規(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是什么類型?

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

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

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

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

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

返回類型后置

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

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

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

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

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

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ù)返回類型后置相結合,在模板編程中的用法,就是用于推導函數(shù)模板的返回類型。之所以將此歸為高級用法,也是因為模板在C++中雖然功能強大,但屬實復雜不易理解。一般是編寫基礎功能庫或是算法庫時,使用到模板的特性。

先看一段示例代碼:

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不同類型的組合,而不必為每種返回類型都去寫一個實現(xiàn)。例如int+int, double+int, string+string等各種組合情況。

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

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

相關文章

  • 用C++實現(xiàn)一個命令行進度條的示例代碼

    用C++實現(xiàn)一個命令行進度條的示例代碼

    這篇文章主要介紹了用C++實現(xiàn)一個命令行進度條的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • 詳解C語言中的Static關鍵字

    詳解C語言中的Static關鍵字

    這篇文章主要為大家介紹了C語言中Static關鍵字,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C/C++之I/O性能優(yōu)化過程

    C/C++之I/O性能優(yōu)化過程

    C++I/O優(yōu)化需禁用同步、減少刷新次數(shù)、批量處理數(shù)據(jù),常用方法包括sync_with_stdio(false)、使用printf/scanf/fread、避免endl、stringstream緩存及文件一次性讀取,針對不同場景(算法競賽、大數(shù)據(jù)、文本處理)選擇合適策略,核心是降低I/O開銷與格式轉換成本
    2025-09-09
  • C++實現(xiàn)雙目立體匹配Census算法的示例代碼

    C++實現(xiàn)雙目立體匹配Census算法的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)雙目立體匹配Census算法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-08-08
  • C語言memset函數(shù)詳解

    C語言memset函數(shù)詳解

    這篇文章主要介紹了C語言中的memset()函數(shù),包括其與memcpy()函數(shù)的區(qū)別,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • c++中冒號(:)和雙冒號(::)的使用說明

    c++中冒號(:)和雙冒號(::)的使用說明

    以下是對c++中冒號和雙冒號的用法進行了介紹,需要的朋友可以過來參考下
    2013-07-07
  • C++類和對象補充

    C++類和對象補充

    類是創(chuàng)建對象的模板,一個類可以創(chuàng)建多個對象,每個對象都是類類型的一個變量;創(chuàng)建對象的過程也叫類的實例化。每個對象都是類的一個具體實例(Instance),擁有類的成員變量和成員函數(shù)
    2021-10-10
  • 淺談C語言中的指針和數(shù)組有什么區(qū)別

    淺談C語言中的指針和數(shù)組有什么區(qū)別

    C語言中的指針和數(shù)組是兩個重要的數(shù)據(jù)結構,它們在內存管理和數(shù)據(jù)存儲方面有許多相似之處,但也存在一些關鍵的區(qū)別,本文就來介紹一下C語言中的指針和數(shù)組有什么區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C++實現(xiàn)動態(tài)煙花效果

    C++實現(xiàn)動態(tài)煙花效果

    這篇文章主要介紹了利用C++實現(xiàn)的放煙花程序,用到了EGE圖形庫,文中的示例代碼講解詳細,對我們學習C++有一定幫助,需要的可以參考一下
    2022-01-01
  • Linux下g++編譯與使用靜態(tài)庫和動態(tài)庫的方法

    Linux下g++編譯與使用靜態(tài)庫和動態(tài)庫的方法

    下面小編就為大家?guī)硪黄狶inux下g++編譯與使用靜態(tài)庫和動態(tài)庫的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論

汾西县| 金门县| 武安市| 平凉市| 安顺市| 林周县| 绵竹市| 玉龙| 秦皇岛市| 沂南县| 望城县| 琼海市| 罗甸县| 临沂市| 称多县| 武定县| 蚌埠市| 金昌市| 陆河县| 神池县| 青川县| 通辽市| 延川县| 准格尔旗| 招远市| 沧州市| 日喀则市| 射洪县| 无锡市| 武乡县| 万山特区| 夹江县| 达日县| 桓台县| 湟源县| 东安县| 天柱县| 怀宁县| 镇雄县| 清河县| 松溪县|