auto和decltype都是c++11標準提出來的型別說明符,都可以通過編譯器自動推斷出表示式的型別,從而用這個型別定義新的變數,如:
double v1 = 9.8, v2 = 1.3;
auto v3 = v1 + v2;
decltype(v1 + v2) v4;
// 我們可以通過typeid().name()來檢視變數的型別,需要加上標頭檔案typeinfo
// 可以看到v3和v4的型別都是d,即double型別
cout << typeid(v3).name() << " " << typeid(v4).name();
auto在定義變數時必須要有初始值,而decltype則不一定需要初始值,比如上面的**所示,auto需要從用來初始化的表示式中推出斷出新定義變數的型別,而decltype則是將表示式寫在括號內,先推斷出型別,再去定義變數。
auto一般會忽略掉頂層const和引用,只保留底層const。而decltype會保留頂層const和引用。(如果你對頂層const和底層const有疑問,這篇部落格:
int i = 0;
const int ci = i, &cr = ci;
auto a = ci; //a是乙個整數(ci的頂層const特性被忽略掉了)
auto b = cr; //b是乙個整數(cr的引用特性被忽略掉了)
auto c = &i; //c是乙個整型指標
auto d = &ci; //d是乙個指整型常量的指標(底層const被保留)
decltype(ci) x = 0; //x的型別是const int(ci的頂層const特性被保留)
decltype(cr) y = x; //y的型別是const int&,y繫結到x(cr的引用特性被保留)
對於decltyp所用的表示式來說,在變數名上加上一對括號得到的型別和不加括號時會有不同。如果decltype給變數加上了一層或者多層括號,那麼編譯器就會把它當成乙個表示式,decltype得到的型別將會是引用。(變數是一種可以作為賦值語句左值的特殊表示式)
int i = 0;
decltype((i)) d; //錯誤:d是int&,必須初始化
decltype(i) d; //正確,d是int,未初始化
當表示式表示乙個陣列時,auto推斷出的型別將會是乙個指標,指向該陣列的第乙個元素的位址,而decltype推斷出的型別將會是乙個陣列。
int ia = ; //ia是乙個含有10個整數的陣列
auto ia2(ia); //ia2是乙個整型指標,指向ia的第乙個元素
decltype(ia) ia3 = ; //ia3是乙個含有10個整數的陣列
如果表示式的內容是解引用操作,則decltype將得到引用型別。
int i =43, j = 12, *p = &i;
decltype(*p) c = j; //c是int&,引用型別,必須初始化
auto型別說明符
c 11新標準引入了auto型別說明符 用它能讓編譯器替我們分析表示式所屬的型別 auto讓編譯器通過初始值來推算出標量的型別。顯然auto定義的變數必須有初始值 auto item vall val2 item的型別通過val2和val1的相加的結果得出 使用auto也能在一條語句中宣告多個變數 ...
auto型別說明符
程式設計時,需要把表示式的值賦給變數,這就要求在宣告變數時清楚知道表示式的型別。為了解決這個問題,c 11引入auto型別說明符,用它就能讓編譯器替我們去分析表示式所屬的型別。auto讓編譯器通過初值來推算變數的型別。因此,auto定義的變數必須有初始值。auto能在一句中定義多個變數,但是這幾個變...
c 11 auto 型別說明符詳解
當使用 auto 自動推斷型別時,需要注意以下幾點 一 必須要有初始值 乙個顯而易見的道理,auto 表示編譯器根據初始值型別推斷宣告變數的型別,因此必須要有初始值。二 一條宣告語句只能有一種基本型別 auto i 0,p i 正確,基本型別是int auto sz 0,pi 3.14 錯誤,由sz...