1.獲知表示式型別: 在編譯期完成型別推導
decltype(expression)很像sizeof用來推導表示式型別大小
int x =10;
decltype
(x) y =1;
// y->int
decltype
(x + y) z =0;
// z->int
const
int& i = x;
decltype
(i) j = y;
// j->const int&
與auto的不同之處:decltype 不會像auto在某種情況下會拋棄cv限定符,保留cv限定符!
2.實際應用:
1) 用於泛型程式設計:
template
<
class
containert
>
class
foo}
;
containert::iterator不能包括所有迭代器型別,比如containert是個const型別,就應當使用const_iterator;
正確方式:
typename
decltype
(containert()
.begin()
) it_;
2)通過變數表示式抽取變數型別,往往只關注變數本身,而不關心其具體型別,例如:
vector<
int> v;
decltype
(v)::value_type i =0;
// 只要知道v是個容器即可,後面而不需要出現vector這樣具體型別了
3.auto與decltype結合使用:返回型別後置(跟蹤返回型別)
在泛型程式設計中,可能通過引數的運算來得到返回值型別。
template
<
typename r,
typename t,
typename u>
r add
(t t, u u)
int a =1;
float b =
2.0;
auto c = add<
decltype
(a+b)
>
(a, b)
;// 缺點:冗長
template
<
typename t,
typename u>
decltype
(t + u)
add(t t, u u)
template
<
typename t,
typename u>
decltype(t
()+u
())add
(t t, u u)
template
<
typename t,
typename u>
decltype((
*(t*)0
)+(*
(u*)0)
) add (t t, u u)
正確:返回型別後置語法:
template
<
typename t,
typename u>
auto
add(t t, u u)
->
decltype
(t + u)
auto關鍵字 decltype關鍵字
自動型別推斷 1 使用auto關鍵字的變數必須有初始值。在定義的時候進行初始化 2 函式引數和模板引數不能被宣告為auto。3 使用auto關鍵字進行型別推導時,如果初始化表示式是引用型別,編譯器會去除引用,除非顯示宣告 4 使用auto使用auto關鍵字進行型別推導時,編譯器會自動忽略頂層cons...
c 中關鍵字decltype
decltype推導出的型別與源 中宣告的物件或函式的型別完全匹配。類似於sizeof操作符,decltype也不需對其運算元求值。粗略來說,decltype e 返回型別前,進行推導 如果表示式e引用本地或命名空間作用域中的變數,靜態成員變數或函式引數,那麼結果就是變數或引數的宣告型別 否則,如果...
c auto和decltype關鍵字
可以用 auto 關鍵字定義變數,編譯器會自動判斷變數的型別。例如 auto i 100 i 是 int auto p new a p 是 a auto k 34343ll k 是 long long 有時,變數的型別名特別長,使用 auto 就會很方便。例如 map mp for auto i m...