語法書 / AA 競程語法書 下冊 / 第十二單元 / 關鍵字 auto:讓編譯器推型態

12.2 關鍵字 auto:讓編譯器推型態

宣告變數時,型態一直是你自己寫的:int x = 1;double y = 1.5;。但仔細想想——右邊的初始值明明已經洩漏了型態(1int1.5double,上冊 2.8 的字面常數規則),為什麼還要左邊再寫一次?

auto 就是「左邊那格讓編譯器自己填」的關鍵字:宣告時只要有初始值,編譯器就能從初始值推出型態

auto a = 1;         // int
auto b = 1LL;       // long long(後綴 LL,上冊 2.8)
auto c = 1.5;       // double
auto d = 'A';       // char
auto e = true;      // bool

注意 auto 不是一種「什麼都能裝的型態」——變數的型態在宣告的瞬間就固定了,跟你手寫的一模一樣,只是打字的人從你換成編譯器。

最有感的場景:型態名稱又臭又長

上面那些例子看不出好處——int 才三個字母,auto 還比較長。auto 真正的舞台是 10.5 那種型態名稱:

✘ 囉唆寫法:

vector<int>::iterator it = v.begin();

✔︎ 省力寫法:

auto it = v.begin();     // 型態照樣是 vector<int>::iterator,一個字都沒少

v.begin() 的回傳型態編譯器一清二楚,何必逼你抄一遍?之後 12.5 的結構化綁定、12.8 的 lambda,型態更是長到(或怪到)根本寫不出來,auto 是唯一的選擇。

auto 一定要有初始值

推型態的線索全部來自初始值,所以沒有初始值就沒得推:

✘ 錯誤寫法:

auto x;         // 編譯錯誤:declaration of 'auto x' has no initializer
cin >> x;

想「先宣告、再讀入」,乖乖把型態寫出來——auto 幫不上忙。

完整規格可查 cppreference: auto

動手試試看:把倒著走的錯誤範例親手跑一次,看看印完 10 之後發生什麼事。再把 auto 改成 int(記得 (int) 轉型),確認世界恢復和平。