C 11新增模板關鍵字decltype

2021-10-02 13:39:38 字數 1959 閱讀 4186

我們知道,使用函式模板可以減少重複性無謂工作量,但是遇到下面的情況c++98可能會束手無策。

template

<

classt1,

class

t2>

void

fun(t1 t1,t2 t2)

我們想把t1,t2的和儲存在乙個變數中,肯定首先必須宣告var的型別,但是var的型別究竟是什麼呢?

在c++98以及之前,我們沒辦法根據t1 t2的型別來宣告var的型別,於是在全球程式設計師們的一致呼聲下,c++11增加了decltype關鍵字!

int t =5;

decltype

(x) y;

decltype(x) 表明和x一樣的型別名,這樣y就被宣告為int型變數。

double d;

short s;

char

* pc;

decltype

(d) dou;

//雙精度浮點型

decltype

(s) age;

//短整型

decltype

(pc) point;

//字元指標型別

如果括號中是乙個函式呼叫,宣告型別和函式返回型別相同

double

price

(int n)

;decltype

(price(3

)) my_price;

//my_price型別為double

需要注意的是,上面的**不會實際呼叫函式,編譯器只會通過檢視函式原型獲取函式返回值型別,為my_price宣告。

double i =

5.9;

decltype

(i+1.1

) x;

//x是double型別

decltype

(599999l

) l;

//l是long型別

請看下面的函式

template

<

typename t1,

typename t2>

return_type sum

(t1 x,t2 y)

這個模板函式是不完整的,因為這裡的return_type到底應該填什麼呢?

因為x和y的型別是不確定的,因此也造成了x+y型別的不確定性。看到以前的的decltype 用法,好像可以使用decltype(x+y)作為函式返回值標識,但是此時還未宣告引數x和y,他們不再作用域中(編譯器無法獲取他們的型別),因此c++11新建了一種函式宣告的語法:

template

<

typename t1,

typename t2>

auto

sum(t1 x,t2 y)

->

decltype

(x+y)

可以寫成這樣,-> decltype(x+y)稱為後置返回型別,這是c++為auto添上的一對翅膀。現在decltype在引數宣告之後,編譯器可以使用引數型別確定函式返回型別!

decltype後括號內可接受的引數很靈活,但是唯一不行的就是不能直接將int ,double,short,char,float等內建資料型別名直接填入。

c 11關鍵字剖析

1 auto 該關鍵字用於兩種情況 1.宣告變數時 根據初始化表示式自動推斷變數型別。2.宣告函式作為函式返回值的佔位符。2static static變數只初始化一次,除此之外它還有可見性的屬性 1.static修飾函式內的 區域性 變數時,表明它不需要在進入或離開函式時建立或銷毀。且僅在函式內可見...

C 11特性 decltype關鍵字

我們之前使用的typeid運算子來查詢乙個變數的型別,這種型別查詢在執行時進行。rtti機制為每乙個型別產生乙個type info型別的資料,而typeid查詢返回的變數相應type info資料,通過name成員函式返回型別的名稱。同時在c 11中typeid還提供了hash code這個成員函式...

C 11基礎 decltype關鍵字

1.decltype關鍵字獲取表示式的型別 int x 0 decltype x y 1 y int2.推導規則decltype exp int n 0 volatile const int x n decltype n a n a int decltype x b n b const volati...