本篇將介紹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 如上 如果兩個列舉中定義了相同名稱的列舉值,將會編譯報錯,因為列舉值並沒有自己的名字空間。針對這種情況,往往會通過名字空間來分割列舉值的...