關於C++14:你需要知道的新特性
使C++更加安全和更加方便的有用新特性
今年8月,經過投票, C++14標準獲得一致通過。目前唯一剩下的工作是ISO進行C++標準的正式發布。在本文中,我關注的是新標準中的幾個重要點,展示了即將到來的改變會如何影響你的編程方式,特別是在使用被現代C++稱之為習語和範型的特性時。
C++標準委員會決心使標準制定過程比過去10年更加快速。這意味著,距上一個標準(即C++11)僅3年的C++14是一次相對較小的發布。這遠非一個令人失望的訊息,恰恰相反,這對程式員來說是個好訊息。因為這樣的話,開發人員能夠即時地跟上新特性。所以,今天你就可以開始使用C++14的新特性了—而且,如果你的工具鏈足夠靈活的話,你幾乎可以使用全部新特性了。
目前你可以從這裡得到標準草案的一份免費副本。遺憾的是,當最終版本的標準發布時,ISO會進行收費。
縮短標準發布的時間間隔可以協助編譯器作者更即時地跟上語言變化。僅隔三年就再次發布,需要調整以適應的變化也就更少。
本文的例子主要在clang 3.4上測試過,clang 3.4覆蓋了大多數C++14的新特性。目前,g++對新特性的覆蓋更少一些,而Visual C++似乎落後更多。 C++14:重大變化
接下來,本文將說明對程式員編碼工作會有重大影響的C++14特性,在給出執行個體的同時,還討論了何時何地因何使用這些特性。 傳回型別推導
在這次發布中,關鍵字auto的作用擴大了。C++語言本身仍然是型別安全的,但是型別安全的機制逐漸改由編譯器而不是程式員來實現。
在C++11中,程式員最初使用auto是用於聲明。這對於像迭代器的建立之類尤其有用,因為完整的正確的類型名可能長得可怕。使用了auto的C++代碼則易讀得多:
| 1 |
for ( auto ii = collection.begin() ; ... |
在C++14中,auto的使用在好幾個方面得到了擴充。其中之一便是意義非凡的傳回型別推導。在一個函數中編寫如下一行代碼:這段代碼依然完全地是型別安全的,因為編譯器知道begin()在上下文中應該返回什麼類型。因此,ii的類型是毫無疑問的,並且在使用ii的每個地方,編譯器都會進行檢查。
對於程式員和編譯器來說,很顯然,函數返回的是double類型。因此在C++14中,程式員可以用auto代替double來定義函數傳回型別:
這個新特性需要注意的一個細節也是相當容易理解的。那就是,如果一個函數有多個返迴路徑,那麼每個返迴路徑返回的值需要具有相同的類型。