7 c0 K" Q2 Y9 w4 E, l# |9 T! ]作者简介 - {* o4 `* o; B( _0 [4 u4 P作者:(加拿大)Michael Wong IBM XL编译器中国开发团队! O* M6 e: h) V! y
" U" Z" o, E' W/ n3 C
Michael Wong,C++11标准委员会(WG21)委员,WG21加拿大代表团团长及IBM公司代表(投票人),WG21 SG5(transactional Memory study group)学习小组组长。除此之外,Michael还是OpenMP委员会的CEO,SCC(Standards Council of Canada)的副主席。 - f! \$ m, u G0 w% tMichael是多个C++11/OpenMP/STM新特性的合作编写者,活跃于各种技术会议,而且为Programming Committee of Boost以及IWOMP等国际会议服务。Michael也是IBM公司的高级技术专家,领导IBM XL C++编译器、XL C编译器的开发工作,当前致力于IBM编译器的C++11新特性部署。Michael在并行编程、C++基准测试、对象模型、泛型编程、模板元编程等多个技术领域均有涉猎,并且在对象模型以及事务内存等方面取得过多个专利。/ O& r; Y. n: {
早年Michael于多伦多大学获取得了天体物理学的学士学位,并在滑铁卢大学获得了硕士学位。在加入IBM之前,Michael曾先后供职于大卫?邓禄普天文台(David Dunlap Observatory),CDC公司(Control Data Corporation),BMO Nesbitt Burns公司等。 " a) t# d$ k9 M6 _! [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新特性的开发工作。 F% y) P$ n! m! }8 v' N
. ~1 r- Q# g/ a0 `, G5 Q# }) k/ G目录免责声明* n. H% A& r: H/ i
序# `6 U. b/ O% l0 h3 f `; T! k+ [
前言8 D5 l$ K: c( ?/ s6 x1 B
第1章新标准的诞生1 4 F" x/ U% P( b# @# h$ Y5 H& p( X1.1曙光:C++11标准的诞生1 0 j a2 M+ m. c+ b! Z: q, f1.1.1C++11/C++0x(以及C11/C1x)——新标准诞生1 ; g5 u3 w* X& T. T+ m+ `3 g) Z7 \1.1.2什么是C++11/C++0x2- Z# k$ Z+ Z* K I' M8 ^* H0 R+ r
1.1.3新C++语言的设计目标3 - q& {! D9 W9 }; L# m) G v1.2今时今日的C++5 " Q8 r$ ~0 ?0 T' H; k1.2.1C++的江湖地位5% j/ Q% k Q0 o4 D0 E
1.2.2C++11语言变化的领域52 [( Y, H+ u- Y
1.3C++11特性的分类77 r5 [: U' f3 F; S: C& t
1.4C++特性一览11 7 I* F8 g: `- _$ h1.4.1稳定性与兼容性之间的抉择11* \0 I. a* a/ m+ a# k# {1 f5 v
1.4.2更倾向于使用库而不是扩展语言来实现特性12# f* g2 j% ?- |
1.4.3更倾向于通用的而不是特殊的手段来实现特性13- ~ p* w) c* Q9 ~! U
1.4.4专家新手一概支持13 8 B( i! @. \5 _6 r* ^' J9 u' X1.4.5增强类型的安全性14 , G0 T6 Y$ G9 R3 T1.4.6与硬件紧密合作14. | y. }. x. f& e
1.4.7开发能够改变人们思维方式的特性15 % G7 w! W8 `7 L* v' }; e1.4.8融入编程现实16 5 K8 Y( e/ e1 ^4 _1.5本书的约定175 g" i1 N* B% q" o: t: Y5 y$ M1 X
1.5.1关于一些术语的翻译17 : t% F1 R1 ?' C) F1 r) z1.5.2关于代码中的注释179 l' M& G ~" k2 ~- p
1.5.3关于本书中的代码示例与实验平台18) ^/ H! F& {" m; A
第2章保证稳定性和兼容性190 u* ~' M. }! Q
2.1保持与C99兼容19 - X t' b, |0 c0 V9 C" N2.1.1预定义宏19: x1 D0 i! [+ U( P; J+ T7 J. y2 z
2.1.2_func_预定义标识符20 " ~9 H* q) B0 r& a' @! d2.1.3_Pragma操作符22 0 Q$ } [' |+ ~9 n+ P% Z2.1.4变长参数的宏定义以及_VA_ARGS_222 W: ^0 J' x: f) {
2.1.5宽窄字符串的连接23 ; m* g# U6 G& L# ~2.2longlong整型23 e! p8 {6 S8 i( d5 e; @2.3扩展的整型254 h' p; S; k$ S7 O+ z7 }, N0 E
2.4宏_cplusplus262 ?0 ?+ m0 _6 V, B( F! ~
2.5静态断言27& l' U4 c: p$ J7 g% Y1 A
2.5.1断言:运行时与预处理时27 + r2 Z# Y' B8 H6 L8 J2.5.2静态断言与static_assert289 l' E( L# c b. `
2.6noexcept修饰符与noexcept操作符32 4 m" Y; A8 X7 F$ D0 ~+ v2.7快速初始化成员变量36* Z3 W, r4 A$ v3 m0 e
2.8非静态成员的sizeof39 2 ]% [6 D+ f- g% R- }/ J# I8 W2.9扩展的friend语法400 f) u. u8 B+ X6 |4 a2 `3 b
2.10final/override控制44% C) h7 M$ O( s: P" i
2.11模板函数的默认模板参数48 : V- } _7 u5 k/ w" i2.12外部模板50+ r: d1 d, `! t$ y
2.12.1为什么需要外部模板50! K8 A5 c4 b3 N) t
2.12.2显式的实例化与外部模板的声明52' K# l; ?. e+ |6 I! H
2.13局部和匿名类型作模板实参54 $ c9 i( f6 |' d- d3 s6 f2.14本章小结55 g' ^$ D3 L n. d1 S3 G' m: k% M
第3章通用为本,专用为末57% t1 l# ~) W$ Y3 N
3.1继承构造函数574 l. p0 D' W6 a+ C7 r
3.2委派构造函数62 ( \- f* Z0 j b0 Z, K H: n3.3右值引用:移动语义和完美转发68 8 i9 n/ s1 ?$ c7 t3.3.1指针成员与拷贝构造68# K6 x. E7 I9 p; J3 [! V
3.3.2移动语义69 - B2 y8 ?5 q. l0 A3 B3.3.3左值、右值与右值引用75 4 n0 `7 \) ]5 e9 u/ K3.3.4std:move:强制转化为右值80' M" Q6 _- m, E5 Y
3.3.5移动语义的一些其他问题82; V! m- \' J3 Z
3.3.6完美转发85" i& J% N$ H+ o! d# Y
3.4显式转换操作符89' F7 P( u' P) e5 o! } T: Q
3.5列表初始化92 ) j" d; M9 G; u3.5.1初始化列表92 " }' S( G( k8 Z+ w F7 J3.5.2防止类型收窄96 8 S+ F g: X0 N) J1 U+ R# X3.6POD类型98 9 j1 l$ w( U V: r7 `# v3.7非受限联合体106 Y( F5 Z' R+ |
3.8用户自定义字面量110 / V/ @) D# W3 ?) F6 z( r3.9内联名字空间113 6 u2 M( o8 o4 J: q5 y ~/ x3.10模板的别名118 ' A6 @- k$ z8 Y, K8 q x+ D3.11一般化的SFINEA规则119 + _( d0 f/ M: r4 o3.12本章小结121+ \, O4 z' @" ~
第4章新手易学,老兵易用123 * L& }$ r% ?! e& t4.1右尖括号>的改进1235 q8 X5 r9 \+ `8 a! e
4.2auto类型推导124 , } k$ t/ e# B' q; s4.2.1静态类型、动态类型与类型推导124 5 S$ I6 Z+ o" S, Z- z4.2.2auto的优势126 / t1 a2 z# K4 s# c& r" C" c) z4.2.3auto的使用细则130 . g3 D; S% ?7 J- Z+ H V4.3decltype134# d: z, y( H% F# x( g
4.3.1typeid与decltype134 2 Y# ]2 A, d9 T) w; l: b% z% u4.3.2decltype的应用1368 b$ e8 o4 c2 ~) ~) Y
4.3.3decltype推导四规则140: Z- w9 x; e2 X/ m
4.3.4cv限制符的继承与冗余的符号143$ S# h! j$ [1 n9 c+ @
4.4追踪返回类型145 ! B" D/ P" ~% M( x4.4.1追踪返回类型的引入145 ; r+ l: O e2 p# y5 m4.4.2使用追踪返回类型的函数146$ M# ~% ~: U3 p |* b& }# j& [
4.5基于范围的for循环150 , I7 x1 F, Z1 f) m8 k# f- ~9 ~- Y4.6本章小结153 ! a! B; n8 ~! i第5章提高类型安全155 2 d; F5 W) K2 c! P5.1强类型枚举155 ! E1 R4 D% s, F6 | G1 K5.1.1枚举:分门别类与数值的名字155& s$ p: h& h/ N9 D/ ^1 d& Y, m0 I
5.1.2有缺陷的枚举类型156. b, p6 n) S2 N6 e4 d$ N: k
5.1.3强类型枚举以及C++11对原有枚举类型的扩展160 * w: v- P0 B j6 V) o4 l! z5.2堆内存管理:智能指针与垃圾回收163' y, T' H v2 f" K) ^
5.2.1显式内存管理163" J" r, y6 f2 _
5.2.2C++11的智能指针164 3 t) h+ y& T* m9 [6 h, i& X! Y6 N5.2.3垃圾回收的分类167 . I! `! j7 S1 g* N5.2.4C++与垃圾回收169 $ `. f# Q0 h& o) Q5.2.5C++11与最小垃圾回收支持170 ) k' [* k$ h, j1 ^' Y! x* _$ T5.2.6垃圾回收的兼容性1722 y3 V# H# t! y
5.3本章小结1735 m! Y( A* S& r3 r3 t5 z
第6章提高性能及操作硬件的能力1749 |# q& [& @8 ?7 j3 k
6.1常量表达式174+ F. ?9 X( ?9 K! a
6.1.1运行时常量性与编译时常量性174 , i9 m; v/ K6 ^* y3 `( Z# u6.1.2常量表达式函数1765 ~- J5 I @6 E; p' R8 f
6.1.3常量表达式值178, U2 y8 {& v' {, q
6.1.4常量表达式的其他应用180' a' S/ V7 r G$ p2 u
6.2变长模板183& `' l E8 @: P
6.2.1变长函数和变长的模板参数183 " G) Z: r5 F/ w$ ~+ x6.2.2变长模板:模板参数包和函数参数包185 + O/ p: v3 _+ ^+ y8 f& g: h6.2.3变长模板:进阶189 3 k$ `9 T- I& ~" ]. `& a4 v3 l6.3原子类型与原子操作196 + j- V$ Q0 \1 Z6.3.1并行编程、多线程与C++11196 ' G2 n. m) F% b o* C; ^& B3 r6.3.2原子操作与C++11原子类型197 5 W3 [+ u1 R" c$ A2 F* A1 d5 \6.3.3内存模型,顺序一致性与memory_order203 4 }) I$ _; }$ D6.4线程局部存储2141 N: I3 M9 o8 q& X/ W
6.5快速退出:quick_exit与at_quick_exit216" o6 T7 q* J& y) R& F
6.6本章小结219# A ~( J- V T0 \
第7章为改变思考方式而改变220$ S/ B$ z% Y: U8 W0 K
7.1指针空值—nullptr220; s4 ]& h( s7 @, _6 j
7.1.1指针空值:从0到NULL,再到nullptr220, F$ k% ?. p W4 M" P; m8 }6 O; [
7.1.2nullptr和nullptr_t223, w7 C. K! \% k2 W) G
7.1.3一些关于nullptr规则的讨论2257 C; M6 j, s7 q: R2 p$ p( r
7.2默认函数的控制227$ z. ?8 A0 ~( p# K8 q
7.2.1类与默认函数227 6 [+ [# \2 V: N" V1 g. O! [* P7.2.2“=default”与“=deleted”230, D$ s1 x4 e1 L' B' N
7.3lambda函数234 * e/ Z" E" N9 t7 ]7.3.1lambda的一些历史234 $ P5 J# t* A9 }7.3.2C++11中的lambda函数2351 ?3 p1 \4 i/ n
7.3.3lambda与仿函数238 , Q6 W! v$ k9 A+ x$ O; I7.3.4lambda的基础使用240 ) @4 C, J1 P7 l6 {# w1 r. C7.3.5关于lambda的一些问题及有趣的实验243" T& u0 m6 o! v% I
7.3.6lambda与STL247 ' q" c6 g- [( x# Y4 H7.3.7更多的一些关于lambda的讨论254! P" Z+ B) C4 I
7.4本章小结256 + x. L1 x4 t- y; o第8章融入实际应用258' e2 x. m! `. i" z
8.1对齐支持258# m R' {1 S7 T$ G2 h; q
8.1.1数据对齐2587 }( @6 r% f# ] [- x
8.1.2C++11的alignof和alignas261 + f# {; d9 l% n3 J" I% j+ u( X: p8.2通用属性2672 ^+ J k. @3 r& Z
8.2.1语言扩展到通用属性267 / `; ?/ {+ V# o5 [9 s8.2.2C++11的通用属性268' ~- M, q/ a& @0 g( m. L$ ^) X# E% @
8.2.3预定义的通用属性270: u) Q- o2 e) W0 p2 B! ?
8.3Unicode支持2745 I5 O/ z6 z8 m; B1 z0 L& G9 c
8.3.1字符集、编码和Unicode274/ m$ V/ f, ~7 L7 r2 n: `* s
8.3.2C++11中的Unicode支持276 . _) z: j1 s! ^6 [8.3.3关于Unicode的库支持280) ]7 e$ A! J/ z4 W
8.4原生字符串字面量284" Y. C8 d& |% f* K0 @& q
8.5本章小结286 ! R- x1 Q& D2 ^" A1 c( U0 c附录AC++11对其他标准的不兼容项目287+ P: s) K/ q+ N
附录B弃用的特性294# D: y9 c8 {/ I1 ?
附录C编译器支持301/ K8 l8 T5 D3 Y8 ~9 N
附录D相关资源304 ! J' ~9 |2 ]+ u; x+ w$ ` 3 K4 k+ b" _1 L- |5 d0 o8 M' A) N9 k 封面 / Q S/ Y0 E' t0 [2 m/ @$ }# s