現代 C++ 語言核心特性解析
謝丙堃
買這商品的人也買了...
-
$480$379 -
$680$537 -
$505自製編譯器
-
$354$336 -
$580$452 -
$750$638 -
$880$695 -
$354$336 -
$834$792 -
$1,200$1,020 -
$894$849 -
$479$455 -
$602嵌入式 C語言自我修養 — 從芯片、編譯器到操作系統
-
$1,008$958 -
$779$740 -
$580$458 -
$374AI 遊戲開發和深度學習進階
-
$320$240 -
$774$735 -
$352C++ 新經典:模板與泛型編程
-
$654$621 -
$714$678 -
$680$537 -
$948$901 -
$600$450
相關主題
商品描述
本書是一本C++進階圖書,全書分為42章,深入探討了從C++11到C++20引入的核心特性。書中不僅通過大量的實例代碼講解特性的概念和語法,還從編譯器的角度分析特性的實現原理,書中還穿插了C++標準委員會制定特性標準時的一些小故事,幫助讀者知其然也知其所以然。
本書適合因為工作需要學習C++新特性的C++從業者,同樣也適合對C++新特性非常感興趣的C++愛好者。而對於C++初學者來說,也有必要在理解C++基礎知識後,通過本書來領略C++的另外一道風景。
作者簡介
謝丙堃,從事 C++ 開發工作十餘年,先後在數家互聯網公司擔任 C++ 開發工程師和技術經理。他也是 C++ 語言的愛好者,熱衷於研究 C++ 語言的新特性以及 C++ 模板元編程技術。
目錄大綱
第 1章 新基礎類型(C++11~C++20) 1
1.1 整數類型long long 1
1.2 新字符類型char16_t和char32_t 4
1.2.1 字符集和編碼方法 4
1.2.2 使用新字符類型char16_t和char32_t 5
1.2.3 wchar_t存在的問題 6
1.2.4 新字符串連接 7
1.2.5 庫對新字符類型的支持 7
1.3 char8_t字符類型 8
1.4 總結 8
第 2章 內聯和嵌套命名空間(C++11~C++20) 9
2.1 內聯命名空間的定義和使用 9
2.2 嵌套命名空間的簡化語法 11
2.3 總結 13
第3章 auto佔位符(C++11~C++17) 14
3.1 重新定義的auto關鍵字 14
3.2 推導規則 16
3.3 什麼時候使用auto 18
3.4 返回類型推導 20
3.5 lambda表達式中使用auto類型推導 20
3.6 非類型模板形參佔位符 21
3.7 總結 22
第4章 decltype說明符(C++11~C++17) 23
4.1 回顧typeof和typeid 23
4.2 使用decltype說明符 24
4.3 推導規則 27
4.4 cv限定符的推導 29
4.5 decltype(auto) 30
4.6 decltype(auto)作為非類型模板形參佔位符 31
4.7 總結 32
第5章 函數返回類型後置(C++11) 33
5.1 使用函數返回類型後置聲明函數 33
5.2 推導函數模板返回類型 34
5.3 總結 36
第6章 右值引用(C++11 C++17 C++20) 37
6.1 左值和右值 37
6.2 左值引用 39
6.3 右值引用 40
6.4 右值的性能優化空間 42
6.5 移動語義 43
6.6 值類別 47
6.7 將左值轉換為右值 48
6.8 萬能引用和引用折疊 50
6.9 完美轉發 52
6.10 針對局部變量和右值引用的隱式移動操作 55
6.11 總結 57
第7章 lambda表達式(C++11~C++20) 58
7.1 lambda表達式語法 58
7.2 捕獲列表 60
7.2.1 作用域 60
7.2.2 捕獲值和捕獲引用 61
7.2.3 特殊的捕獲方法 64
7.3 lambda表達式的實現原理 65
7.4 無狀態lambda表達式 68
7.5 在STL中使用lambda表達式 68
7.6 廣義捕獲 69
7.7 泛型lambda表達式 72
7.8 常量lambda表達式和捕獲*this 72
7.9 捕獲[=, this] 73
7.10 模板語法的泛型lambda表達式 74
7.11 可構造和可賦值的無狀態lambda表達式 76
7.12 總結 77
第8章 非靜態數據成員默認初始化(C++11 C++20) 78
8.1 使用默認初始化 78
8.2 位域的默認初始化 79
8.3 總結 80
第9章 列表初始化(C++11 C++20) 81
9.1 回顧變量初始化 81
9.2 使用列表初始化 82
9.3 std::initializer_list詳解 84
9.4 使用列表初始化的注意事項 86
9.4.1 隱式縮窄轉換問題 86
9.4.2 列表初始化的優先級問題 87
9.5 指定初始化 88
9.6 總結 90
第 10章 默認和刪除函數(C++11) 91
10.1 類的特殊成員函數 91
10.2 顯式默認和顯式刪除 95
10.3 顯式刪除的其他用法 98
10.4 explicit和=delete 99
10.5 總結 100
第 11章 非受限聯合類型(C++11) 101
11.1 聯合類型在C++中的局限性 101
11.2 使用非受限聯合類型 102
11.3 總結 106
第 12章 委託構造函數(C++11) 107
12.1 冗餘的構造函數 107
12.2 委託構造函數 110
12.3 委託模板構造函數 114
12.4 捕獲委託構造函數的異常 115
12.5 委託參數較少的構造函數 116
12.6 總結 117
第 13章 繼承構造函數(C++11) 118
13.1 繼承關係中構造函數的困局 118
13.2 使用繼承構造函數 119
13.3 總結 123
第 14章 強枚舉類型(C++11 C++17 C++20) 124
14.1 枚舉類型的弊端 124
14.2 使用強枚舉類型 129
14.3 列表初始化有底層類型枚舉對象 131
14.4 使用using打開強枚舉類型 133
14.5 總結 135
第 15章 擴展的聚合類型(C++17 C++20) 136
15.1 聚合類型的新定義 136
15.2 聚合類型的初始化 137
15.3 擴展聚合類型的兼容問題 139
15.4 禁止聚合類型使用用戶聲明的構造函數 140
15.5 使用帶小括號的列表初始化聚合類型對象 142
15.6 總結 143
第 16章 override和final說明符(C++11) 144
16.1 重寫、重載和隱藏 144
16.2 重寫引發的問題 145
16.3 使用override說明符 145
16.4 使用final說明符 146
16.5 override和final說明符的特別之處 148
16.6 總結 148
第 17章 基於範圍的for循環(C++11 C++17 C++20) 149
17.1 煩瑣的容器遍歷 149
17.2 基於範圍的for循環語法 150
17.3 begin和end函數不必返回相同類型 151
17.4 臨時範圍表達式的陷阱 152
17.5 實現一個支持基於範圍的for循環的類 153
17.6 總結 155
第 18章 支持初始化語句的if和switch(C++17) 156
18.1 支持初始化語句的if 156
18.2 支持初始化語句的switch 159
18.3 總結 160
第 19章 static_assert聲明 161
19.1 運行時斷言 161
19.2 靜態斷言的需求 162
19.3 靜態斷言 163
19.4 單參數static_assert 164
19.5 總結 165
第 20章 結構化綁定(C++17 C++20) 166
20.1 使用結構化綁定 166
20.2 深入理解結構化綁定 169
20.3 結構化綁定的3種類型 171
20.3.1 綁定到原生數組 171
20.3.2 綁定到結構體和類對象 172
20.3.3 綁定到元組和類元組的對象 173
20.4 實現一個類元組類型 175
20.5 綁定的訪問權限問題 178
20.6 總結 179
第 21章 noexcept關鍵字(C++11 C++17 C++20) 180
21.1 使用noexcept代替throw 180
21.2 用noexcept來解決移動構造問題 183
21.3 noexcept和throw() 185
21.4 默認使用noexcept的函數 186
21.5 使用noexcept的時機 189
21.6 將異常規範作為類型的一部分 190
21.7 總結 192
第 22章 類型別名和別名模板(C++11 C++14) 193
22.1 類型別名 193
22.2 別名模板 194
22.3 總結 196
第 23章 指針字面量nullptr(C++11) 197
23.1 零值整數字面量 197
23.2 nullptr關鍵字 198
23.3 總結 201
第 24章 三向比較(C++20) 202
24.1 “太空飛船”(spaceship)運算符 202
24.2 三向比較的返回類型 202
24.2.1 std::strong_ordering 203
24.2.2 std::weak_ordering 204
24.2.3 std::partial_ordering 205
24.3 對基礎類型的支持 206
24.4 自動生成的比較運算符函數 207
24.5 兼容舊代碼 210
24.6 總結 211
第 25章 線程局部存儲(C++11) 212
25.1 操作系統和編譯器對線程局部存儲的支持 212
25.2 thread_local說明符 213
25.3 總結 217
第 26章 擴展的inline說明符(C++17) 218
26.1 定義非常量靜態成員變量的問題 218
26.2 使用inline說明符 219
26.3 總結 220
第 27章 常量表達式(C++11~C++20) 221
27.1 常量的不確定性 221
27.2 constexpr值 224
27.3 constexpr函數 225
27.4 constexpr構造函數 228
27.5 對浮點的支持 230
27.6 C++14標準對常量表達式函數的增強 230
27.7 constexpr lambdas表達式 233
27.8 constexpr的內聯屬性 235
27.9 if constexpr 236
27.10 允許constexpr虛函數 240
27.11 允許在constexpr函數中出現Try-catch 244
27.12 允許在constexpr中進行平凡的默認初始化 244
27.13 允許在constexpr中更改聯合類型的有效成員 245
27.14 使用consteval聲明立即函數 246
27.15 使用constinit檢查常量初始化 247
27.16 判斷常量求值環境 248
27.17 總結 252
第 28章 確定的表達式求值順序(C++17) 253
28.1 表達式求值順序的不確定性 253
28.2 表達式求值順序詳解 254
28.3 總結 255
第 29章 字面量優化(C++11~C++17) 257
29.1 十六進制浮點字面量 257
29.2 二進制整數字面量 258
29.3 單引號作為整數分隔符 258
29.4 原生字符串字面量 259
29.5 用戶自定義字面量 261
29.6 總結 267
第30章 alignas和alignof(C++11 C++17) 268
30.1 不可忽視的數據對齊問題 268
30.2 C++11標準之前控制數據對齊的方法 270
30.3 使用alignof運算符 272
30.4 使用alignas說明符 273
30.5 其他關於對齊字節長度的支持 276
30.6 C++17中使用new分配指定對齊字節長度的對象 278
30.7 總結 279
第31章 屬性說明符和標準屬性(C++11~C++20) 280
31.1 GCC的屬性語法 280
31.2 MSVC的屬性語法 281
31.3 標準屬性說明符語法 282
31.4 使用using打開屬性的命名空間 283
31.5 標準屬性 283
31.5.1 noreturn 284
31.5.2 carries_dependency 286
31.5.3 deprecated 286
31.5.4 fallthrough 287
31.5.5 nodiscard 288
31.5.6 maybe_unused 290
31.5.7 likely和unlikely 290
31.5.8 no_unique_address 291
31.6 總結 293
第32章 新增預處理器和宏(C++17 C++20) 294
32.1 預處理器__has_include 294
32.2 特性測試宏 295
32.2.1 屬性特性測試宏 295
32.2.2 語言功能特性測試宏 295
32.2.3 標準庫功能特性測試宏 297
32.3 新增宏__VA_OPT__ 301
32.4 總結 302
第33章 協程(C++20) 303
33.1 協程的使用方法 303
33.2 協程的實現原理 308
33.2.1 co_await運算符原理 308
33.2.2 co_yield運算符原理 313
33.2.3 co_return運算符原理 317
33.2.4 promise_type的其他功能 319
33.3 總結 320
第34章 基礎特性的其他優化(C++11~C++20) 321
34.1 顯式自定義類型轉換運算符(C++11) 321
34.2 關於std::launder()(C++17) 325
34.3 返回值優化(C++11~C++17) 326
34.4 允許按值進行默認比較(C++20) 333
34.5 支持new表達式推導數組長度(C++20) 334
34.6 允許數組轉換為未知範圍的數組(C++20) 335
34.7 在delete運算符函數中析構對象(C++20) 336
34.8 調用偽析構函數結束對象聲明周期(C++20) 337
34.9 修復const和默認複製構造函數不匹配造成無法編譯的問題
(C++20) 338
34.10 不推薦使用volatile的情況(C++20) 339
34.11 不推薦在下標表達式中使用逗號運算符(C++20) 340
34.12 模塊(C++20) 340
34.13 總結 341
第35章 可變參數模板(C++11 C++17 C++20) 342
35.1 可變參數模板的概念和語法 342
35.2 形參包展開 344
35.3 sizeof. . .運算符 352
35.4 可變參數模板的遞歸計算 353
35.5 折疊表達式 354
35.6 一元折疊表達式中空參數包的特殊處理 357
35.7 using聲明中的包展開 358
35.8 lambda表達式初始化捕獲的包展開 359
35.9 總結 361
第36章 typename優化(C++17 C++20) 362
36.1 允許使用typename聲明模板形參 362
36.2 減少typename使用的必要性 363
36.3 總結 365
第37章 模板參數優化(C++11 C++17 C++20) 366
37.1 允許常量求值作為所有非類型模板的實參 366
37.2 允許局部和匿名類型作為模板實參 368
37.3 允許函數模板的默認模板參數 369
37.4 函數模板添加到ADL查找規則 370
37.5 允許非類型模板形參中的字面量類類型 371
37.6 擴展的模板參數匹配規則 373
37.7 總結 374
第38章 類模板的模板實參推導(C++17 C++20) 375
38.1 通過初始化構造推導類模板的模板實參 375
38.2 拷貝初始化優先 377
38.3 lambda類型的用途 378
38.4 別名模板的類模板實參推導 380
38.5 聚合類型的類模板實參推導 380
38.6 總結 382
第39章 用戶自定義推導指引(C++17) 383
39.1 使用自定義推導指引推導模板實例 383
39.2 聚合類型類模板的推導指引 386
39.3 總結 387
第40章 SFINAE(C++11) 388
40.1 替換失敗和編譯錯誤 388
40.2 SFINAE規則詳解 389
40.3 總結 394
第41章 概念和約束(C++20) 395
41.1 使用std::enable_if約束模板 395
41.2 概念的背景介紹 396
41.3 使用concept和約束表達式定義概念 397
41.4 requires子句和約束檢查順序 398
41.5 原子約束 401
41.6 requires表達式 403
41.6.1 簡單要求 404
41.6.2 類型要求 405
41.6.3 複合要求 405
41.6.4 嵌套要求 406
41.7 約束可變參數模板 407
41.8 約束類模板特化 408
41.9 約束auto 409
41.10 總結 410
第42章 模板特性的其他優化(C++11 C++14) 411
42.1 外部模板(C++11) 411
42.2 連續右尖括號的解析優化(C++11) 413
42.3 friend聲明模板形參(C++11) 415
42.4 變量模板(C++14) 417
42.5 explicit(bool) 419
42.6 總結 423
附錄 特性章節對照表 424