1. 程式人生 > >C++17/14/11 個人備忘

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