iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 10
0

上上一篇稍微聊了 auto 的「基本面」,僅說明其對程式碼語法的影響,這一篇要講 auto 的「語義」。首先,再複習一次 auto 的定義:

For variables, specifies that the type of the variable that is being declared will be automatically deduced from its initializer.

使用 auto 來定義變數,其變數型別「由其 initializer(暫時想不到合適的中譯)決定(編譯時期)」。這也暗示了,使用 auto 定義變數,「不會有變數沒有初始化就被使用」的臭蟲。考慮以下程式碼:

int i;
auto x = 1 + 2.0;

i 沒有被明確初始化,其值未知,若冒然使用,程式執行結果也未知(不定時炸彈)。相反地,由於 auto 必須透過 initializer 來推導其型別,因此,不會出現「變數值沒有初始化即拿來使用的問題」。上述 auto 若等號右邊沒有指定算式(Expression)或數值,那麼編譯器會報錯。因此,auto 帶來的語義為:

使用 auto 宣告的變數必定有初始值。

auto 的另一個功能是確保程式碼正確性。考慮以下程式:

std::vector<int> v;
unsigned int sz = v.size();

v.size() 的回傳型別應該是 std::vector<int>::size_type,但過於冗長,而且,就算有 IDE 輔助,也需要打不少字,因此,常見手法是用 unsigned int 接住,但也因此「養了一隻臭蟲」。

上述程式編譯成 32-bit 版本,std::vector<int>::size_type 為 32-bit(4-byte);若編譯成 64-bit,則為 64-bit(8-byte)。因此,在 64-bit 的系統上運行,v.size() 的值有可能超過 unsigned int 最大值。使用 auto 可以避免這種情況:

std::vector<int> v;
auto sz = v.size();

所以說,要跟 auto 當好朋友。

延伸閱讀


上一篇
DAY 8:Modern C++ 要角,老語言回春的關鍵,談 auto/decltype,卷二
下一篇
DAY 10:Function Object and std::function,卷一
系列文
山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑26

尚未有邦友留言

立即登入留言