碼農們老實說,我們已經習慣了下面的 if 條件式寫法:
auto vi = GetIntegers();
if (vi.empty())
// Do A.
else
// Do B.
C++ 人很龜毛,這種「小地方」還是有辦法找出「優化」的地方。C++17 納入了 if with initializer
,上述程式碼可以改寫成:
if (auto vi = GetIntegers(); !vi.empty())
// Do A.
else
// Do B.
除了少一行外,更重要的是 vi
的「可視範圍(Scope)」變小了。好的 C++ 程式碼有一個原則:能達到同樣目的,變數的可視範圍越小越好。
上述例子中,vi
無法被 else
區塊的程式碼使用,大大限縮了可視範圍,減少副作用。
switch
也同樣有 switch with initializer
的新功能,寫法如下:
switch (auto owner{GetOwner()}; owner.type()) {
case kAccept1Country2System: return "Shit!";
case kTaiwanIsNotPartOfChina: return "Bravo!";
}
同樣地,owner
只能在 switch
statement 的範圍內被使用,這是優點。
Visual Studio 2019 目前以 C++14 為預設值,欲使用上述功能,記得要變更專案設定。
最底下的例子,switch 的括號裡面有兩個 statements。switch 要怎麼知道要用哪個 statement 的回傳值來判斷跑哪個 case? 是一律用最右邊那個 statement 的回傳值嗎? 可以放三個以上的 statements 嗎?
// 比如這樣?
switch (auto owner{GetOwner()}; auto owner2{owner.Father()}; owner2.type()) {
}
好問題。我沒去翻標準規格書,不過,一個 if/switch 裡頭似乎只能有一個 statement(有分號的那一段),另一個是 condition。
if/switch 裡的 statement 一定會先被執行,然後才是後面個 condition。