我們經常會將表達式的值賦給變量,這就要求在變量聲明時清楚地知道表達式的類型。有時候是很復雜的一件事,在C++11中引入了auto類型說明符,用它就能讓編譯器替我們去分析表達式所屬的類型。當然,auto變量必須有初始值,這樣編譯器才能推斷其類型:
double val1 = 1.1, val2 = 2.2; auto item = val1 + val2; // item為double類型
auto i0 = 0, *pI = &i0; // ok, i0為int類型, p為int指針 auto sz = 0, pi = 3.14; // fail, sz和pi類型不一致
編譯器推斷出來的auto類型有時候和初始值類型不完全一致,編譯器會適當的改變結果類型使其更符合初始化規則。
引用:使用引用實際上使用的是引用的對象,當引用被用作初始化時,真正參與初始化的其實是引用對象的值。此時,編譯器以引用對象的類型作為auto的類型:
int i = 0, &r = i; auto a = r; // a是一個int,r是i的別名,而i是一個int
const int ci = i, &cr = ci; auto b = ci; // b是一個int,ci的頂層const被忽略 auto c = cr; // c是一個int,cr的頂層const被忽略 auto d = &i; // d是一個int型指針 auto e = &ci; // e是一個指向整型常量的指針,對常量對象取地址是一種底層const
const auto f = ci;
auto &g = ci; // g是一個整型常量引用,綁定到ci auto &h = 42; // error, 不能為非常量引用綁定字面值 const auto &j = 42; // ok,可以為常量引用綁定字面值
auto k = ci, &l = i; // k是int, l是int& auto &m = ci, *p = &ci; // m是對整型常量的引用,p是指向整型常量的指針 auto &n = i, *p2 = &ci; // error, n是對整型的引用,p2是指向整型常量的指針
const int i = 42; auto j = i; // j是int const auto &k = i; // k是int i的常量引用 auto *p = &i; // p是指向整型常量i的指針 const auto j2 = i, &k2 = i; // j2是整型常量, k2是int i的常量引用