现代C++语言核心特性解析

现代C++语言核心特性解析
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
作者:
2021-10
版次: 1
ISBN: 9787115564177
定价: 119.90
装帧: 平装
页数: 427页
字数: 591千字
31人买过
  • 本书是一本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 long1

    1.2  新字符类型char16_t和char32_t4

    1.2.1  字符集和编码方法4

    1.2.2  使用新字符类型char16_t和char32_t5

    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  什么时候使用auto18

    3.4  返回类型推导20

    3.5  lambda表达式中使用auto类型推导20

    3.6  非类型模板形参占位符21

    3.7  总结22

    第4章 decltype说明符(C++11~C++17)23

    4.1  回顾typeof和typeid23

    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表达式和捕获*this72

    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和=delete99

    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  支持初始化语句的if156

    18.2  支持初始化语句的switch159

    18.3  总结160

    第 19章 static_assert声明161

    19.1  运行时断言161

    19.2  静态断言的需求162

    19.3  静态断言163

    19.4  单参数static_assert164

    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代替throw180

    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_ordering203

    24.2.2  std::weak_ordering204

    24.2.3  std::partial_ordering205

    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 constexpr236

    27.10  允许constexpr虚函数240

    27.11  允许在constexpr函数中出现Try-catch244

    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  noreturn284

    31.5.2  carries_dependency286

    31.5.3  deprecated286

    31.5.4  fallthrough287

    31.5.5  nodiscard288

    31.5.6  maybe_unused290

    31.5.7  likely和unlikely290

    31.5.8  no_unique_address291

    31.6  总结293

    第32章 新增预处理器和宏(C++17 C++20)294

    32.1  预处理器__has_include294

    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  约束auto409

    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
  • 内容简介:
    本书是一本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 long1

    1.2  新字符类型char16_t和char32_t4

    1.2.1  字符集和编码方法4

    1.2.2  使用新字符类型char16_t和char32_t5

    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  什么时候使用auto18

    3.4  返回类型推导20

    3.5  lambda表达式中使用auto类型推导20

    3.6  非类型模板形参占位符21

    3.7  总结22

    第4章 decltype说明符(C++11~C++17)23

    4.1  回顾typeof和typeid23

    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表达式和捕获*this72

    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和=delete99

    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  支持初始化语句的if156

    18.2  支持初始化语句的switch159

    18.3  总结160

    第 19章 static_assert声明161

    19.1  运行时断言161

    19.2  静态断言的需求162

    19.3  静态断言163

    19.4  单参数static_assert164

    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代替throw180

    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_ordering203

    24.2.2  std::weak_ordering204

    24.2.3  std::partial_ordering205

    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 constexpr236

    27.10  允许constexpr虚函数240

    27.11  允许在constexpr函数中出现Try-catch244

    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  noreturn284

    31.5.2  carries_dependency286

    31.5.3  deprecated286

    31.5.4  fallthrough287

    31.5.5  nodiscard288

    31.5.6  maybe_unused290

    31.5.7  likely和unlikely290

    31.5.8  no_unique_address291

    31.6  总结293

    第32章 新增预处理器和宏(C++17 C++20)294

    32.1  预处理器__has_include294

    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  约束auto409

    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
查看详情
相关图书 / 更多
现代C++语言核心特性解析
现代演化经济学
[美]理查德·R.纳尔逊 著;石俊国 陈莹 译
现代C++语言核心特性解析
现代分析方法
兰州大学分析化学教研室 主编
现代C++语言核心特性解析
现代水工混凝土关键技术
田育功
现代C++语言核心特性解析
现代家具生产与运作管理()
熊先青 主编
现代C++语言核心特性解析
现代工科实验室安全
谢晖
现代C++语言核心特性解析
现代大学英语(第三版)(精读)(4)(同步测试)
国伟
现代C++语言核心特性解析
现代放射治疗设备学
卢洁,李小波,巩贯忠
现代C++语言核心特性解析
现代文阅读满分答题公式+120篇阅读训练 7-9年级
有道语文教研中心
现代C++语言核心特性解析
现代小说化读
王鼎钧
现代C++语言核心特性解析
现代汉语书面语历时语域变异研究
李佳蕾
现代C++语言核心特性解析
现代护士临床必读
郭丽娟
现代C++语言核心特性解析
现代合作性金融制度的产生、变迁及功能研究
杨焱