C++17/14/11 個人備忘
給自己看的。
我的情況:從 C++ Primer 第五版 入門,該版基於C++11,但不是專門講C++11的,只提到了部分相關內容。後來自己看過一些介紹 C++11相關的書,查過一些資料。14/17沒去了解過。
從17開始,再到14,再到11
17
// 似乎正式標準還發沒出來
// 這裡應該算是draft吧,N4640目前是最新的?
http://www.open-std.org/JTC1/SC22/WG21/
https://github.com/cplusplus/draft
//
https://www.meetingcpp.com/blog/items/final-features-of-c17.html
// 這個好
http://geek.csdn.net/news/detail/228484C++17
// 這個裡面的連結可以點的。。。
http://blog.csdn.net/fesdobat/article/details/75154004?locationNum=2&fps=1
// 這個就列舉了一下名字。。
http://c.tedu.cn/kbsk/224822.html
// 維基百科,應該算比較新的吧?
https://en.wikipedia.org/wiki/C%2B%2B17
// 知乎大神 藍色 的專欄
// 應該還會有新的發出來
https://zhuanlan.zhihu.com/p/25434012
https://zhuanlan.zhihu.com/p/25855097
https://zhuanlan.zhihu.com/p/26920039
// 這個一大堆,也不知道是不是大部分都砍掉了
// 但是每個都附上了openstd的提案,建議看這個
http://blog.jobbole.com/111801/
// module似乎已經砍掉了
https://www.zhihu.com/question/37330979/answer/73595024
// 知乎大神 藍色 的演講
// 相關的module,concept 已經砍掉
https://github.com/FrozenGene/presentation/blob/master/pdf/C%2B%2B17%E6%96%B0%E7%89%B9%E6%80%A7%E5%B8%A6%E6%9D%A5%E7%9A%84%E6%94%B9%E5%96%84%E5%92%8C%E5%BD%B1%E5%93%8D.pdf
// auto配大括號初始化的規定,上面 知乎 藍色 的專欄也提到了
// 沒有 藍色 的寫的全,不如看藍色的,因為還有幾種禁用的
http://blog.csdn.net/zwvista/article/details/53812819
// fold expression摺疊表示式,講到了預設值
// 看這個吧
http://blog.csdn.net/zwvista/article/details/53981696
// structured binding declaration 結構化繫結宣告
// 一次宣告和初始化多個變數
http://blog.csdn.net/zwvista/article/details/78111346
// 基於區間的for迴圈
// 以前預設使用begin(),end(),型別要一樣,現在可以不用了,但是也要begin(),end(),型別可以不一樣,需要提供operator!= ( BEGIN_TYPE,END_TYPE)
// 具體的看文章裡寫的for迴圈展開成什麼樣就懂了
http://blog.csdn.net/zwvista/article/details/52304605
// 這裡提到了理由
// 認為過去的for區間迴圈是 over-constrained,也就是說有不必要的約束條件
// end在過去只需要和begin比一比,不需要遞增遞減等各種操作,沒必要約束其為iterator
https://stackoverflow.com/questions/39117330/how-the-new-range-based-for-loop-in-c17-helps-ranges-ts
// 允許巢狀的名稱空間
// 。。。說實話這個戳到我痛點了,寫N層名稱空間,光說對齊都受不了
// 從標準上保證了某些情況下的copy elision
// wiki上的一條
https://en.wikipedia.org/wiki/C%2B%2B17
// if constexpr,似乎也沒說清楚,這裡的constexpr如果不是編譯期可得怎麼辦,內部是否求值?這些問題
// 用最新版g++試了試, 必須提供編譯期可得的值,所以求值不求值沒什麼所謂了?
// 似乎也不對,哪怕執行constexpr也有可能有副作用的吧?
// 試試,哦發現了。。標準裡提了一句,constexpr內部可以使用生命期開始於函式之後的變數,所以副作用別人也看不到。。。無所謂了
// any
http://www.cnblogs.com/thinkway/p/6743772.html
http://en.cppreference.com/w/cpp/utility/any
// any_cast也要注意一點的,直接cast到右值,就被當右值用了,比如說下面這個例子
http://en.cppreference.com/w/cpp/utility/any/any_cast
// variant,可以看做型別安全的union
// 注意型別轉換,裡面提到了std::variant<std::string,bool> 用 char*的話, 自動轉bool而不是string?
http://en.cppreference.com/w/cpp/utility/variant
http://www.cnblogs.com/thinkway/p/6743684.html
// std::in_place, std::in_place_type, std::in_place_index,std::in_place_t , std::in_place_type_t, std::in_place_index_t這些
見cppreference裡面單獨的那一章,還有optional,variant,any的相關構造方式部分
http://en.cppreference.com/w/cpp/utility/in_place
還有我在知乎的提問和自問自答。。
https://www.zhihu.com/question/66032208/answer/237524884
// 標準庫容器允許不完全型別,不確定是否寫進標準了
https://www.zhihu.com/question/32222337?sort=created
// inline variable
// inline可以用在變數上了
見草案N4640 7.16
https://stackoverflow.com/questions/38043442/how-do-inline-variables-work
// lambda捕獲this的一些新規定
// 以前是預設捕獲this,訪問成員也是使用預設捕獲的this。
// 為了複製*this,以前需要使用一些繞彎子的做法,而且有一些弊端(見下面網頁詳述)
//現在可以選擇 以傳值方式捕獲 *this,配合c++14 lambda可以在捕獲列表那裡使用初始化,用起來很舒服
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0018r3.html
// byte型別
// byte不允許數學運算,只允許位運算。專注於記憶體方面。將以前char , unsigned char型別的大雜燴職責 分離。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0298r3.pdf
http://en.cppreference.com/w/cpp/types/byte
https://www.zhihu.com/question/56607671
// optional型別
// 舉例來說,以前用std::pair<T,bool> 表示函式返回成功或者失敗和返回的物件。
// 現在可以用optional (類似variant<nullopt_t,T> 但是有專門的介面)
// 一個優點是,如果失敗了就不必構造T了
14
//
https://news.cnblogs.com/n/503451/
//
http://blog.csdn.net/u012234115/article/details/47209679
// constexpr 函式不一定總是返回編譯期結果。 這個以前還真沒注意,想了想有道理,如果引數在編譯期不可得,那肯定沒法編譯期計算
// 如果傳了編譯期無法得到的引數進去,不知道會怎麼樣
// 有說報錯的,有說執行期計算的
https://www.zhihu.com/question/35614219
// constexpr變數一定是頂層const ?
// constexpr 更加易用
// 注意constexpr編譯期和執行期程式碼統一
http://blog.csdn.net/zwvista/article/details/54429416
// constexpr 類成員函式不再預設const 等一些細節
// 官方
// 非官方,不確定正確與否
http://blog.csdn.net/yhl_leo/article/details/50864210
// 標準庫允許提供 兩個引數型別不同的比較函數了
// 詳見,藍形參的回答。
https://www.zhihu.com/question/22765983
// 這個人的部落格,有一堆新特性的嘗試
// 寫的貌似不錯
http://blog.csdn.net/zwvista/article/list/2
// 尤其是這個decltype decltype(auto)這篇
http://blog.csdn.net/zwvista/article/details/54571821
11
// 有助於理解lambda和各種類似作用的其他方法
// 注意裡面用的是11正式出來之前寫的0x標準
// 現在不僅11出來了,更新的14,17都有了。。。而且lambda許多方面都被修改的更易使用了
http://blog.csdn.net/zdy0_2004/article/details/50278819
// 這個直接轉載的wiki。。。
http://blog.csdn.net/u012234115/article/details/47209625
// wiki c++11的比c++17長太多了哈哈哈
https://zh.wikipedia.org/wiki/C%2B%2B11#.E7.B7.92.E7.A8.8B.E6.94.AF.E6.8F.B4
// 執行緒、鎖、原子型別、 。。。 這一大堆東西都不算熟悉,primer沒怎麼講過。都是在別的地方陸陸續續看得,不成體系
// 一些基本概念都在上面幾個有,詳細的話,再找找
// cpp reference 就不錯,比如說thread就那幾個介面,概念也挺簡單的
// 這個是cpp reference的 thread support ilbrary總覽
http://en.cppreference.com/w/cpp/thread
// thread的建構函式裡,args預設傳值了,所以如果需要傳給function的引數是引用, 注意用std::ref,std::cref包一下
// thread的靜態函式成員, hardware_concurrency可以執行期獲得硬體支援的並行數(比如4核就是4,提示說並不準,畢竟有很多現實問題,比如說以前見到過什麼一個核可以當兩個核用什麼的。。。)
http://en.cppreference.com/w/cpp/thread/thread
// mutex
// 一般用RAII, 見
http://en.cppreference.com/w/cpp/thread/mutex/lock
// ...太多了,不一一記了。
// 反正就是把cpp reference的所有相關部分看一遍
// 基本上就是搜尋出來的前幾個吧,詳細的我覺得應該看本專門的書
http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438288.html
// 系列,這個挺好的
http://www.cnblogs.com/haippy/p/3284540.html
// 還有上面那個系列的詳細版,更棒
https://github.com/forhappy/Cplusplus-Concurrency-In-Practice
// 注意C++17有了新的mutex型別,
// 據說std::scoped_lock在個方面均嚴格優於lock_guard,
// 現在應該用新的mutex了
// 是在C++17的那個網頁裡看到的 http://blog.jobbole.com/111801/
// cppreference也有了http://en.cppreference.com/w/cpp/thread/scoped_lock