《深入理解C 11》筆記 decltype

2021-08-21 07:23:17 字數 2395 閱讀 2170

本篇將介紹decltype的用法。decltype與auto類似,也能進行型別推導,但是用法有一定的區別,decltype推導出的型別能作為型別宣告變數:

int main()

decltype的應用

一種是decltype和typedef/using的合用:

using size_t = decltype(sizeof(0));

using ptrdiff_t = decltype((int*)0 - (int*)0);

using nullptr_t = decltype(nullptr);

另外,與auto相同可以用於簡化**增強可讀性:

std::map

mapstring;

using mapitor = decltype(mapstring.begin());

for (mapitor i = mapstring.begin(); i != mapstring.end(); ++i)

for (decltype(mapstring)::iterator i = mapstring.begin(); i != mapstring.end(); ++i)

還有一種用法是重用匿名型別,但是實際開發中匿名型別一般是為了不讓外部進行重用,所以使用這種用法前需要多考慮:

struct anon;

int main()

還能擴大模板泛型的能力:

template

void sum(const t1& a, const t2& b, decltype(a + b)& s) // 自動推導輸出引數s的型別

int main()

decltype推導四規則

int i = 0;

decltype(i) a;

decltpye((i)) b; // 編譯失敗,提示引用型別

如上**,decltype雙括號無法通過編譯,因為decltype推導型別會有幾個規則 - decltype(type):

再回頭看之前的**decltype(i) a;使用了規則1,因為i是沒有帶括號的標記符表示式,所以推導的型別為int。而decltpye((i)) b;是帶括號的標記符表示式,所以使用了規則3,型別為int&。

我們再通過一些例子來詳細了解一下以上規則的使用:

struct s  s;

int func(int);

int func(double);

int&& rvalue();

const

bool isvalue(int);

int main()

; int* ptr = arr;

decltype(arr) var1; // int[5],不帶括號的標記符表示式

decltype(ptr) var2; // int*,不帶括號的標記符表示式

decltype(s.d) var3; // double,不帶括號的成員訪問表示式

decltype(func) var4; // 編譯失敗,是過載的函式

decltype(rvalue()) var5 = 1; // int&&,將亡值

// 左值推導為型別的引用

decltype((i)) var6 = i; // int&帶括號的左值

decltype(++i) var7= i; // int&,++i返回i的左值

decltype(arr[3]) var8 = i; // int&,返回i的左值

decltype(*ptr) var9 = i; // int&,*返回i的左值

decltype("lvalue") var10 = "lvalue"; // const char(&), 字串字面常量為左值

// 以上都不是,推導為本型別

decltype(1) var11; // int,處理字串字面常量以外的值為右值

decltype(i++) var14; // int, i++返回右值

decltype((isvalue(1))); // const bool,圓括號可以忽略

return

0;}

cv限制符的繼承與冗餘的符號

int main()

可以看到,decltype推導的型別有時候會忽略一些冗餘的符號,包括const、volatile、引用符號&。

深入理解C 11 筆記

include using namespace std classa a 對於含有堆記憶體的類,需要提供深拷貝的拷貝建構函式,避免預設的拷貝構造使用淺拷貝導致堆記憶體的重複刪除。a const a a m ptr new int a.m ptr 通過移動構造,a 作為函式引數,只使用淺拷貝避免臨時物...

《深入理解C 11》筆記 追蹤返回型別

templatedecltype 2 a doublevalue t a 用decltype推導返回型別但是對於編譯器來說,是從左到右進行編譯的,decltype在進行推導時並不知道a的型別,所以這種寫法是編譯不過的。為了解決這個問題,於是引入了追蹤返回型別 template auto double...

《深入理解C 11》筆記 強型別列舉

本篇開始介紹第五章的內容 強型別列舉。列舉enum的使用應該十分常見,用於定義同一類的資料。但是列舉其實存在一定的問題 enum male enum female 如上 如果兩個列舉中定義了相同名稱的列舉值,將會編譯報錯,因為列舉值並沒有自己的名字空間。針對這種情況,往往會通過名字空間來分割列舉值的...