12.2 關鍵字 auto:讓編譯器推型態
宣告變數時,型態一直是你自己寫的:int x = 1;、double y = 1.5;。但仔細想想——右邊的初始值明明已經洩漏了型態(1 是 int、1.5 是 double,上冊 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) 轉型),確認世界恢復和平。