decltype關鍵字與返回型別後置

2021-10-05 23:56:41 字數 1956 閱讀 4040

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...