這篇是參考《Changes between C++14 and C++17 DIS》,他主要是在描述 C++14 到 C++17 的變化;雖然由於 C++17 其實還是草案,所以很多東西都還有變數。不過由於他這邊整理的滿清楚的,所以這邊就稍微紀錄一下。
這篇文章,基本上把 C++14 到 C++17 的變化,整理出幾個部分:
- Removed or deprecated features(移除與已棄用的功能)
- New core language features with global / local applicability (新的核心語言功能)
- New library features(新的函式庫功能)
- Modifications to existing features(現有功能的修改)
- Miscellaneous(雜項)
而 Heresy 這邊,則是把自己覺得比較有趣、有用的東西整理、紀錄一下。
Lambda expression 和 ths
C++11 加入的 lambda expression 在 Heresy 來看,是個很實用的功能,Heresy 目前也常常會用到它;在 C++14 中,讓 lambda expression 可以使用 auto 來做自動的型別判斷,更是增加了他使用的彈性(參考)。
而在 C++17 中,則是讓 lambda expression 捕捉 *this 時,更為簡單;在 C++14 如果希望在 class 裡面撰寫 lambda expression、並使用該類別的成員的話,需要寫成:
[self = *this]{ self.f(); }
而在 C++17 則可以簡單寫成:
[*this]{ f(); }
這樣一來,撰寫的便利性又更高了不少~
Filesystem 正式引進
Filesystem 的用處主要是幫助開發者處理檔案的路徑、並做系統檔案管理之用的函式庫,Heresy 從他還在 Boost 中的時候就在用了,有興趣的話可以參考《C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem》。
而在 C++17,似乎終於打算把這套函式庫正式加入標準函式庫了~所以如果以後要用 C++ 來處理檔案、目錄的話,就有一個標準的方案了~
平行化函式庫:Parallelism
在 C++ 撰寫需要大量計算的程式的時候,如果想要善用多核心處理器、想要平行化處理的話,以往大多是得使用其他標準(例如 OpenMP)、或是其他函式庫(例如 Intel Threading Building Blocks)來做輔助。
而在 C++17,則是引進了 Parallelism 這個函式庫,提供了一些演算法、以及函式,可以以 STL 的形式、快速地寫出平行化的程式。
以排序來說,只要寫:
vector<int> v = ... sort(par, v.begin(), v.end());
就可以平行地進行排序了~
這樣一來,對於要撰寫大量計算的程式的開發者來說,也會是相當方便的一件事。
不過,如果能把 GPGPU 也加進來,應該會更好吧~ :p
這部分可以參考《Visual C++ 2013 的 STL 平行化函示庫》。
shared_ptr 支援陣列
以往在如果要使用 shared_ptr 這個 smart pointer 來搭配傳統的陣列的話,基本上必須要自己指定釋放資源的方法(deleter),才可以正確地釋放資源。
下面就是 C++17 前的寫法:
std::shared_ptr<char> p(new char[N], std::default_delete<char[]>());
而 C++17 中,則是將它改成可以正確地對應陣列,所以不用再寫 deleter 了~
std::shared_ptr<char[]> p(new char[N]);
基本上,也是一個提昇便利性的改變了。
幾個新的類別
C++17 也加入了如 string_view、any、variant、optional 這些在某些情況下,算是滿實用的類別,如果有需要的話,應該也是很實用的。
這邊大概就這樣了。
當然,C++17 裡面還有很多東西,有興趣就建議直接去看原文吧~
[…] C++17,為了簡化這邊的開發難度,則是又引進了「fold […]
讚讚
[…] C++17 的時候,加入的一個還算滿好用的功能、structured binding […]
讚讚
[…] C++17 裡面,應該是為了解決這個問題,又另外加入了 […]
讚讚
[…] C++17 開始,也可以省略 template […]
讚讚
[…] std::span 外,在 C++17 的時候也有提供 std::string_view(文件);他和 std::span […]
讚讚