條款3 理解decltype

2021-10-19 22:56:24 字數 2206 閱讀 4699

對於給定的名字或表示式,decltype能告訴你改名字或表示式的型別;考慮如下**:

const

int i =0;

//decltype(i)是const int

boolf(

const widget &w)

;// decltype(w)是const widget &

// decltype(f)是bool f(const widget&)

struct point

;widget w;

// decltype(w)是widgetif(

f(w)).

..// decltype(f(w))是bool

vector<

int> v;

// decltype(v)是vector

if(v[0]

==0).

..// decltype(v[0])是int&

c++11中,decltype的主要用途大概就在於宣告那些返回值型別以來與形參型別的函式模板;如:

template

<

typename container,

typename index>

auto

authandaccess

(container &c, index i)

->

decltype

(c[i]

)

採用這麼乙個宣告後,operator返回值是什麼型別,authandaccess的返回值就是什麼型別,和我們期望的結果一致;

而在c++14中可以去掉返回值型別尾序語法:

template

<

typename container,

typename index>

// c++14

auto

authandaccess

(container &c, index i)

// 不一定正確

條款2說過:編譯器會對auto指定為返回型別的函式實現模板型別推導:

std::deque<

int> d;

// ...

authandaccess

(d,5)=

10;

上述**中d[5]返回的是int&,但是對於authandaccess的返回值實施auto型別推導將剝去引用飾詞,這麼一來返回值型別就成了int,將10賦值給乙個右值int顯然是錯誤的;

想要authandaccess正確執行,就要對返回值實施decltype型別推導,在c++14中通過decltype(auto)飾詞解決了這個問題:

template

<

typename container,

typename index>

// c++14能夠運作,但仍亟須改進

decltype

(auto

)authandaccess

(container& c, index i)

現在一般情況下c[i]返回t&authandaccess也會返回t&,若你也想在初始愛護表示式處應用decltype型別推導規則,也可以照樣操作:

widget w;

const widget& cw = w;

auto mywidget1 = cw;

// auto型別推導:mywidget1的型別是widget

decltype

(auto

) mywidget2 = cw;

// decltype型別推導,mywidget2的型別是cosnt widget&

條款3,盡量使用const

條款03 盡可能使用 const const允許你指定乙個語義約束,也就是指定乙個 不該被改動 的物件。const如果出現在星號左邊,表示被指物是常量,如果出現在星號右邊,表示指標自身是常量 如果出現在星號兩邊,表示被指物和指標都是常量。如果被指物是常量,有些程式會將關鍵字const寫在型別之前,有...

Effective C 條款15 第3章

provide access to raw resources in resources managing classes 資源管理類 resource managing classes 很棒.它們是對抗資源洩露的堡壘.在乙個良好的環境中將依賴這樣的classes來處理和資源之間的所有互動.而不是直...

《深入理解C 11》筆記 decltype

本篇將介紹decltype的用法。decltype與auto類似,也能進行型別推導,但是用法有一定的區別,decltype推導出的型別能作為型別宣告變數 int main decltype的應用 一種是decltype和typedef using的合用 using size t decltype s...