一本深入探讨C++11~C++17最新语言特性的书推荐给你

Posted 人邮异步社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一本深入探讨C++11~C++17最新语言特性的书推荐给你相关的知识,希望对你有一定的参考价值。

近10年来C++的更新可谓是非常频繁,这让我在2017年时感受到了一丝不安。那个时候我发现在开源平台上已经有很多项目采用C++11和C++14标准编写,其中不乏一些知名的代码库,而公司里所用的编译环境还没有完全支持C++11,也很少有人真正了解过C++11的新特性。这带来一个很严重的问题,公司项目依赖的代码库更新到最新标准以后,我们将难以在一时之间维护甚至阅读它们,因为C++之父曾经说过“These enhancements are sufficient to make C++11 feel like a new language.”,他认为新特性的增强足以使C++11感觉像是一种新语言。可见即使是掌握C++11标准也需要将其当作一门新语言去学习,更何况当时的情况是C++17标准对C++又一次进行了大幅更新,很多原来的理解已经不准确甚至是不正确的了。尽管如此,我当时却没办法找到一本深入探讨C++11~C++17最新语言特性的书,在互联网上也只能找到零散的资料,并且大多数还是英文的。于是我产生了自己动手写一本深入探讨 C++最新语言特性的图书的想法。事实证明,我的担忧是有必要的。到目前为止已经有越来越多的项目开始迁移到新的C++标准,例如LLVM(C++14)、thrust(C++17)等,C++正在进入一个全新的时代,作为程序员的我们必须与时俱进地学习这些新特性来确保我们的技术不会过时。

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

本书并不是直接告诉读者C++11~C++20的新特性该怎么使用,而是希望读者通过本书能够了解新特性诞生的前因后果,用实际例子探讨过去C++中的缺陷以及新特性如何修复和完善优化,并且尽可能地描述新特性在编译器中的实现原理。它没有告诉读者“你应该这样使用这个新特性”,而是在说“嘿,我有一个不错的新特性,可以解决你手中的问题,它的原理是……而且关于这个特性我还有一个小故事,想听听么?”另外,为了保证新特性被编译器切实有效地实现,本书中几乎所有的代码都采用GCC、CLang和MSVC编译过。在编译器表现与C++标准描述不一致的时候会提醒读者注意其中的区别。

本书是一本C++进阶图书,全书分为42章,深入探讨了从C++11到C++20引入的核心特性。书中不仅通过大量的实例代码讲解特性的概念和语法,还从编译器的角度分析特性的实现原理,书中还穿插了C++标准委员会制定特性标准时的一些小故事,帮助读者知其然也知其所以然。

本书的读者需要具有一定的C++基础,并且想要学习C++新特性或者因为工作项目需要学习C++新特性。对于有基础的读者来说,本书的大部分章节都比较容易理解,极少数章节可能需要反复阅读以加深理解。模板相关的大部分章节也不会成为阅读的障碍,有泛型编程和模板元编程经验的读者理解起来会更快一些。

《现代C++语言核心特性解析》的组织结构

本书的内容编排是理论结合实践,涵盖了C++11~C++20全部新增的语言核心特性,本书既能当作一本教材让读者可以由浅入深、由基础特性到高级特性来掌握新增特性的原理和用法,也能作为一本“字典”让读者有针对性地查阅单个特性。

本书分为两个部分,第一部分(第1~34章)是讲解基础特性,这部分内容在编程过程中会经常用到,具体如下。

第1章介绍C++11~C++20新增的基础类型,包括新的long long整型和多个新字符类型。

第2章介绍内联和嵌套命名空间,通过本章读者将学到如何在外部无感知的情况下切换命名空间。

第3章探讨了新特性中的重点auto占位符,探究它的推导规则,在lambda表达式中的应用,这将会是读者在现今C++中用到最多的关键字。

第4章探讨了decltype说明符,同样阐述了其推导规则,并将decltype(auto)和auto做了详细比较,有助于读者厘清两者的区别。

第5章介绍了函数返回类型后置特性,读者可以通过这种函数声明方式让编译器自动推导返回类型。

第6章深入探讨了右值引用,该特性是所有新特性中最难理解的特性之一。本章一步一步引导读者理解右值引用的含义和用途,并介绍其在移动语义中发挥的重要作用。另外还深入介绍了值类别,包括泛左值、纯右值和将亡值。

第7章介绍了lambda表达式特性,C++11~C++20逐步递进地讨论了lambda表达式功能的增强,包括基础语法、广义捕获、泛型lambda表达式以及如何在lambda表达式中使用模板语法。

第8章介绍了新的类成员的初始化方法,并且阐述了该方法与初始化列表的区别和优势。

第9章探究了列表初始化,该特性为初始化容器类型的对象提供了方便。本章详细描述了其工作原理并且演示了如何让自定义容器支持列表初始化。

第10章介绍了指定默认和删除函数的方法,读者通过本章可以学到如何通过指定默认函数强制编译器生成函数,以及删除特定函数让编译器无法自动生成。

第11章介绍非受限联合类型,该特性可以解决联合类型在C++中缺乏实用性的问题,通过非受限联合类型可以在联合类型中声明非平凡类型成员。

第12章和第13章介绍了委托构造函数和继承构造函数,它们都是为了解决C++类中构造函数代码冗余的问题。

第14章探究了强枚举类型,强枚举类型解决了普通枚举类型中几个一直被诟病的问题,包括类型检查不严格、底层类型定义不清晰等。

第15章详细探讨了扩展的聚合类型,阐明聚合类型的新定义,指出该新定义下过去代码中可能出现的问题。

第16章介绍了override和final说明符,说明了重写、重载和隐藏的区别,读者可以通过这两个说明符将虚函数重写的语法检查工作交给编译器。

第17章深入探讨了基于范围的for循环,该特性能简化枚举容器中元素的代码,除了描述该特性的使用方法,本章还说明了for循环的实现原理,并且实现了一个支持基于范围的for循环容器例子。

第18章介绍了支持初始化语句的if和switch,使用该特性可以将变量的初始化以及条件判断统一到相同的作用域。

第19章介绍了static_assert关键字,读者可以通过本章了解如何通过static_assert让代码在编译阶段就找到错误。

第20章深入探讨了结构化绑定的使用方式、规则和原理,通过本章,读者将学会如何让C++像Python一样返回多个值,如何让一个第三方类型支持结构化绑定语法。

第21章介绍了noexcept关键字,描述了noexcept相对于throw()的优势,并且探讨了noexcept在作为运算符时如何为移动构造函数提供异常控制的支持。

第22章讨论了类型别名和别名模板,读者通过本章将学会通过using关键字定义类型别名,并且掌握别名模板为后续模板的相关特性打下基础。

第23章介绍了指针字面量nullptr,讨论了nullptr对比0作为空指针常量的优势。

第24章探究了三向比较特性,阐述了三向比较运算符的语法,返回类型特征以及自动生成其他比较运算符的规则。

第25章介绍了线程局部存储,读者可以从本章了解到编译器和操作系统支持线程局部存储的方法,以及线程局部存储解决了哪些问题。

第26章介绍了扩展的inline说明符特性,该特性解决了类的非常量静态成员变量声明必须和定义分开的问题。

第27章深入探究了常量表达式。本章有一定难度,不仅介绍了使用constexpr定义常量表达式函数、构造函数,并且分不同时期的标准探讨了使常量表达式成立的规则的变化,另外还讨论了constexpr在if控制结构、lambda表达式和虚函数中的应用。

第28章讨论了表达式求值顺序的问题,新特性解决了C++17之前C++标准没有对表达式求值顺序做严格规定的问题。

第29章讨论了新标准对字面量的优化,其中集中描述了新标准对二进制整数、十六进制浮点、原生字符串字面量的支持,另外还详细介绍了如何实现自定义字面量。

第30章深入探讨了alignas和alignof关键字。本章从CPU的角度出发讨论了数据对齐对于程序运行效率的重要性,进而说明如何使用新标准提供的方式完成数据对齐,最后用实例证明了数据对齐对性能的影响。

第31章介绍了属性说明符和标准属性,通过本章读者将学会使用属性的方法,了解指定属性的规则,并且能充分理解C++11到C++20中的9个标准属性。

第32章介绍了新增预处理器和宏。本章展示了使用__has_include预处理器判断是否包含头文件的方法,并且介绍了一系列的特性测试宏,使用它们可以判断编译器对某个特性的支持程度。

第33章深入探讨了协程的使用方法和原理,从如何简单地借助标准库使用协程入手,分别诠释了co_await、co_yield和co_return运算符原理,并且展示了如何自定义一个支持协程的类型。

第34章是一些其他基础特性的优化,虽然这些特性比较简短不成体系但是却也相当重要,比如返回值优化,允许数组转换为未知范围的数组等。

从第35章开始进入本书的第二部分,第二部分主要探讨的是模板相关的新特性,具体如下。

第35章深入讨论了可变参数模板。本章中除了介绍可变参数模板的基本语法,还深入讨论了形参包展开的各种场景,展示了使用可变参数模板进行模板元编程的方法,最后探讨了C++17中折叠表达式的语法和规则。

第36章介绍了新标准对typename的优化,新标准明确指明了可以省略typename的场景,并且让模板参数支持使用typename。

第37章集中介绍了新标准对模板参数的改进,包括允许局部和匿名类型作为模板实参、将函数模板添加到ADL查找规则中等。

第38章讨论了新标准模板推导的优化,在C++17标准之前实例化类模板必须显式指定模板实参,但是现在不需要了。本章介绍了使用构造函数推导类模板实参的方法以及它在各种场景下的应用。

第39章介绍了用户定义推导指引,读者通过本章将学到如何通过自定义推导指引来控制编译器推导模板实例路径。

第40章讨论了SFINAE规则,通过SFINAE规则开发人员能够控制编译器选择模板实例化的方法,SFINAE规则也是模板元编程必不可少的组成部分。

第41章深入探讨了概念和约束,通过这部分内容读者可以体会到对编译器前所未有的掌控力,概念可以通过各方面约束编译器对模板的实例化。本章详细讨论了concept和requires的语法和使用规则,并且展示了其在可变参数模板和auto中的约束作用。

第42章介绍了模板特性的其他优化,包括新增的变量模板以及使用friend声明模板形参的优化等。

读完这本书你将收获什么

为什么我的类在使用C++17标准后无法初始化对象了?

为什么在不改变任何代码的情况下,用新编译器编译的程序运行效率提高了?

想定义lambda表达式用于异步调用,却发现导致未定义的行为该怎么办?

想让编辑器自动推导返回类型该怎么办?

作为库的作者,想在客户调用库代码的时候判断客户提供的类是否具有某个成员函数,以及采用不同的实现方案时该怎么做?

读完这本书读者不仅会找到以上这些问题的答案,还将了解答案背后的原理和故事。

以上是关于一本深入探讨C++11~C++17最新语言特性的书推荐给你的主要内容,如果未能解决你的问题,请参考以下文章

每周一书-编写高质量代码:改善C程序代码的125个建议

帮忙推荐一本C#设计模式方面的书

C++17是什么?看这本最新指南书册《C++17标准语言新特性》109页pdf

请推荐一本关于使用 boost.thread 或 C++11 进行多线程的有价值的书

从effective C++中窥探C++11特性

关于《深入理解计算机系统》一书