C++有兩個分水嶺
一個是在C++11以前的
另一個是C++11以後的
稱為Modern C++
這篇我就focus on Modern C++
大概就是C++11 C++14 C++17 C++20
Modern C++會強調
* Smart Pointer
自動回收空間
能避免dangling reference造成程式crash
* Perfect Forwarding / R-value reference
首先
先去了解什麼是 r-value/l-value
再去了解r-value-reference/l-value-reference
然後完美轉發就是基於 R-value reference
如果有人問你
"C++比C快在哪裡"
你可以回它因為有著Perfect forwarding的機制在
* std:thread
concurrency的表準化
裡面除了mutex外
還有效率更高的atom
兩者有各自適合的地方
* constexpr關鍵字
可以讓編譯器在編譯時期優化的一個新cv-qualified
* auto/decltype 型別推斷
C++11開始引入
現在C++17已經算是很完整了
如果型別是編譯時期就知道的
請使用auto關鍵字
給定一段程式
template<typename It> // algorithm to dwim ("do what I mean")
void dwim(It b, It e) // for all elements in range from
{
//想自動取的It<T> 裡面的型別T作為初始化宣告
T val = ...
}
你有想過我要如何自動得到並初始化
It<T>裡面的型別T嗎
這要要用到trait-class
template<typename It> // algorithm to dwim ("do what I mean")
void dwim(It b, It e) // for all elements in range from
{ // b to e
while (b != e) {
typename std::iterator_traits<It>::value_type
currValue = *b;
…
}
}
三小 這麼簡地的事情也要弄到那麼複雜的trait-class
C++11自從有了auto之後,
這件事情不再痛苦
template<typename It> // as before
void dwim(It b, It e)
{
while (b != e) {
auto currValue = *b;
…
}
* 請使用 using A = TYPE 取代 typedef
trait-calss是個有點複雜的東西
請愛用using + auto 取代這個
比方說
std::remove_const<T>::type 可以寫成
std::remove_const_t<T> ,
而std::remove_const_t<T> 的實作即
template <class T>
using remove_const_t = typename remove_const<T>::type;
推薦書籍:
Effective Modern C++
但建議先看過:
Effective C++
結論: 歡迎跳槽到rust ^_^