《深刻理解C++11:C++11新特性解析與應用》編輯推薦:C++標準委員會成員和IBM XL編譯器中國開發團隊共同撰寫,權威性毋庸置疑。系統、深刻、詳盡地講解了C++11新標準中的新語言特性、新標準庫特性、對原有特性的改進,以及全部這些新特性的應用。前端
做者:(加拿大)Michael Wong IBM XL編譯器中國開發團隊
Michael Wong,C++11標準委員會(WG21)委員,WG21加拿大表明團團長及IBM公司表明(投票人),WG21 SG5(transactional Memory study group)學習小組組長。除此以外,Michael仍是OpenMP委員會的CEO,SCC(Standards Council of Canada)的副主席。
Michael是多個C++11/OpenMP/STM新特性的合做編寫者,活躍於各類技術會議,並且爲Programming Committee of Boost以及IWOMP等國際會議服務。Michael也是IBM公司的高級技術專家,領導IBM XL C++編譯器、XL C編譯器的開發工做,當前致力於IBM編譯器的C++11新特性部署。Michael在並行編程、C++基準測試、對象模型、泛型編程、模板元編程等多個技術領域均有涉獵,而且在對象模型以及事務內存等方面取得過多個專利。
早年Michael於多倫多大學獲取得了天體物理學的學士學位,並在滑鐵盧大學得到了碩士學位。在加入IBM以前,Michael曾前後供職於大衛?鄧祿普天文臺(David Dunlap Observatory),CDC公司(Control Data Corporation),BMO Nesbitt Burns公司等。
IBM XL編譯器中國開發團隊,IBM擁有悠久的編譯器開發歷史(始於上世紀80年代),在全球有將近400名高素質工程師組成的研發團隊,其中包括許多世界知名的研究學者和技術專家。IBM一直以來都是編程語言的制定者和倡導者之一,並將長期在編譯領域進行研發和投資。IBM編譯器中國開發團隊於2010年在上海成立,現擁有編譯器前端開發人員(C/C++)、後端開發人員、測試人員,以及性能分析人員共16人。團隊與IBM北美編譯器團隊緊密合做,共同開發、測試和發佈基於POWER系統的AIX及Linux平臺下的XL C/C++和XL Fortran系列產品,並對其提供技術支持。雖然團隊成立時間不長,但已於2012年成功發佈最新版本的XL C/C++ for Linux V12.1 & XL Fortran for Linux V14.1,並得到7項發明專利。團隊成員擁有較豐富的編譯器開發經驗,對編譯技術、編程語言、性能優化和並行計算等各領域都有必定的研究,也對C++11標準的各類新特性有較早的研究和理解,並正在實際地參與C++11新特性的開發工做。編程
免責聲明
序
前言
第1章新標準的誕生1
1.1曙光:C++11標準的誕生1
1.1.1C++11/C++0x(以及C11/C1x)——新標準誕生1
1.1.2什麼是C++11/C++0x2
1.1.3新C++語言的設計目標3
1.2今時今日的C++5
1.2.1C++的江湖地位5
1.2.2C++11語言變化的領域5
1.3C++11特性的分類7
1.4C++特性一覽11
1.4.1穩定性與兼容性之間的抉擇11
1.4.2更傾向於使用庫而不是擴展語言來實現特性12
1.4.3更傾向於通用的而不是特殊的手段來實現特性13
1.4.4專家新手一律支持13
1.4.5加強類型的安全性14
1.4.6與硬件緊密合做14
1.4.7開發可以改變人們思惟方式的特性15
1.4.8融入編程現實16
1.5本書的約定17
1.5.1關於一些術語的翻譯17
1.5.2關於代碼中的註釋17
1.5.3關於本書中的代碼示例與實驗平臺18
第2章保證穩定性和兼容性19
2.1保持與C99兼容19
2.1.1預約義宏19
2.1.2_func_預約義標識符20
2.1.3_Pragma操做符22
2.1.4變長參數的宏定義以及_VA_ARGS_22
2.1.5寬窄字符串的鏈接23
2.2longlong整型23
2.3擴展的整型25
2.4宏_cplusplus26
2.5靜態斷言27
2.5.1斷言:運行時與預處理時27
2.5.2靜態斷言與static_assert28
2.6noexcept修飾符與noexcept操做符32
2.7快速初始化成員變量36
2.8非靜態成員的sizeof39
2.9擴展的friend語法40
2.10final/override控制44
2.11模板函數的默認模板參數48
2.12外部模板50
2.12.1爲何須要外部模板50
2.12.2顯式的實例化與外部模板的聲明52
2.13局部和匿名類型做模板實參54
2.14本章小結55
第3章通用爲本,專用爲末57
3.1繼承構造函數57
3.2委派構造函數62
3.3右值引用:移動語義和完美轉發68
3.3.1指針成員與拷貝構造68
3.3.2移動語義69
3.3.3左值、右值與右值引用75
3.3.4std:move:強制轉化爲右值80
3.3.5移動語義的一些其餘問題82
3.3.6完美轉發85
3.4顯式轉換操做符89
3.5列表初始化92
3.5.1初始化列表92
3.5.2防止類型收窄96
3.6POD類型98
3.7非受限聯合體106
3.8用戶自定義字面量110
3.9內聯名字空間113
3.10模板的別名118
3.11通常化的SFINEA規則119
3.12本章小結121
第4章新手易學,老兵易用123
4.1右尖括號>的改進123
4.2auto類型推導124
4.2.1靜態類型、動態類型與類型推導124
4.2.2auto的優點126
4.2.3auto的使用細則130
4.3decltype134
4.3.1typeid與decltype134
4.3.2decltype的應用136
4.3.3decltype推導四規則140
4.3.4cv限制符的繼承與冗餘的符號143
4.4追蹤返回類型145
4.4.1追蹤返回類型的引入145
4.4.2使用追蹤返回類型的函數146
4.5基於範圍的for循環150
4.6本章小結153
第5章提升類型安全155
5.1強類型枚舉155
5.1.1枚舉:分門別類與數值的名字155
5.1.2有缺陷的枚舉類型156
5.1.3強類型枚舉以及C++11對原有枚舉類型的擴展160
5.2堆內存管理:智能指針與垃圾回收163
5.2.1顯式內存管理163
5.2.2C++11的智能指針164
5.2.3垃圾回收的分類167
5.2.4C++與垃圾回收169
5.2.5C++11與最小垃圾回收支持170
5.2.6垃圾回收的兼容性172
5.3本章小結173
第6章提升性能及操做硬件的能力174
6.1常量表達式174
6.1.1運行時常量性與編譯時常量性174
6.1.2常量表達式函數176
6.1.3常量表達式值178
6.1.4常量表達式的其餘應用180
6.2變長模板183
6.2.1變長函數和變長的模板參數183
6.2.2變長模板:模板參數包和函數參數包185
6.2.3變長模板:進階189
6.3原子類型與原子操做196
6.3.1並行編程、多線程與C++11196
6.3.2原子操做與C++11原子類型197
6.3.3內存模型,順序一致性與memory_order203
6.4線程局部存儲214
6.5快速退出:quick_exit與at_quick_exit216
6.6本章小結219
第7章爲改變思考方式而改變220
7.1指針空值—nullptr220
7.1.1指針空值:從0到NULL,再到nullptr220
7.1.2nullptr和nullptr_t223
7.1.3一些關於nullptr規則的討論225
7.2默認函數的控制227
7.2.1類與默認函數227
7.2.2「=default」與「=deleted」230
7.3lambda函數234
7.3.1lambda的一些歷史234
7.3.2C++11中的lambda函數235
7.3.3lambda與仿函數238
7.3.4lambda的基礎使用240
7.3.5關於lambda的一些問題及有趣的實驗243
7.3.6lambda與STL247
7.3.7更多的一些關於lambda的討論254
7.4本章小結256
第8章融入實際應用258
8.1對齊支持258
8.1.1數據對齊258
8.1.2C++11的alignof和alignas261
8.2通用屬性267
8.2.1語言擴展到通用屬性267
8.2.2C++11的通用屬性268
8.2.3預約義的通用屬性270
8.3Unicode支持274
8.3.1字符集、編碼和Unicode274
8.3.2C++11中的Unicode支持276
8.3.3關於Unicode的庫支持280
8.4原生字符串字面量284
8.5本章小結286
附錄AC++11對其餘標準的不兼容項目287
附錄B棄用的特性294
附錄C編譯器支持301
附錄D相關資源304後端