我們知道,使用函式模板可以減少重複性無謂工作量,但是遇到下面的情況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...