读《深入理解C++11:C++11新特性解析与应用》
虽然设计C++11的目的是为了要取代C++98/03,不过相比于C++03标准,C++11则带来了数量可观的变化,这包括了约140个新特性,以及对C++03标准中约600个缺陷的修正。
设计目标
C++98/03的设计目标
比C语言更适合系统编程(且与C语言兼容)。
支持数据抽象。
支持面向对象编程。
支持泛型编程。
C++11的设计目标
使得C++成为更好的适用于系统开发及库开发的语言。
使得C++成为更易于教学的语言(语法更加一致化和简单化)。
保证语言的稳定性,以及和C++03及C语言的兼容性。
显著增强
通过内存模型、线程、原子操作等来支持本地并行编程(Native Concurrency)。
通过统一初始化表达式、auto、declytype、移动语义等来统一对泛型编程的支持。
通过constexpr、POD(概念)等更好地支持系统编程。
通过内联命名空间、继承构造函数和右值引用等,以更好地支持库的构建。
编程理念
❑ 保持语言的稳定性和兼容性(Maintain stability and compatibility)。
❑ 更倾向于使用库而不是扩展语言来实现特性(Prefer libraries to language extensions)。
❑ 更倾向于通用的而不是特殊的手段来实现特性(Prefer generality to specialization)。
❑ 专家新手一概支持(Support both experts and novices)。
❑ 增强类型的安全性(Increase type safety)。
❑ 增强代码执行性能和操作硬件的能力(Improve performance and ability to work directly with hardware)。
❑ 开发能够改变人们思维方式的特性(Make only changes that change the way people think)。
❑ 融入编程现实(Fit into the real world)。
Scott Mayers特性分类方式
❑ 类作者需要的(class writer,简称为“类作者”)
❑ 库作者需要的(library writer,简称为“库作者”)
❑ 所有人需要的(everyone,简称为“所有人”)
❑ 部分人需要的(everyone else,简称为“部分人”)
标准库特性
不在本书重点讲,会稍稍涉及
❑ 算法增强Algorithm improvements
❑ 容器增强Container improvements
❑ 分配算符Scoped allocators
❑ std::array
❑ std::forward_list
❑ 无序容器Unordered containers
❑ sts::tuple
❑ 类型特性Type traits
❑ std::function, std::bind
❑ unique_ptr
❑ shared_ptr
❑ weak_ptr
❑ 线程Threads
❑ 互斥Mutex
❑ 锁Locks
❑ 条件变量Condition variables
❑ 时间工具Time utilities
❑ std::future, std::promises
❑ std::async
❑ 随机数Random numbers
❑ 正则表达式regex
新关键字
提出新关键字是非常危险的,可能与存量代码产生冲突。因此委员会在创立新关键字时参考了已有开源代码和企业代表的意见,尽可能将冲突降到最低,比如static_assert,名字特别长且丑,就是为了避开存量。
❑ alignas
❑ alignof decltype
❑ auto(重新定义)
❑ static_assert
❑ using(重新定义)
❑ noexcept
❑ export(弃用,不过未来可能留作他用)
❑ nullptr
❑ constexpr
❑ thread_local
在C++11中还有两个具有特殊含义的新标识符:override、final。这两个标识符如何被编译器解释与它们所在的位置有关。如果这两个标识符出现在成员函数之后,它们的作用是标注一个成员函数是否可以被重载。不过读者实际上也可以在C++11代码中定义出override、final这样名称的变量。而在这样的情况下,它们只是标识了普通的变量名称而已。
其他改进
C++98/03不支持双尖括号作为模板的模板,需要空格,而C++11支持,例如下句。
vector> veclist;
在C++11中,标准统一了变量初始化方法,所以模板作者可以总是在模板编写中采用集合初始化(初始化列表),这也有助于避免类型收窄。
强类型枚举,避免枚举类型之间的混淆。
为更好的支持嵌入式编程,提高性能、降低存储空间,引入常量表达式和原子操作,尤其是内存模型,可以lock free。另外,标准增加了constexpr,它让函数和变量可以被编译时的常量取代,而从效果上说,函数和变量在固定内存设备中要求的空间变得更少。
C++11中的原生字符串常量则可免除“转义”的需要,例如输入URL里的/时不需要再用\进行转义了。
属性,__attribute__((attribute-name))这样的写法,除了不怎么好看外,每一个编译器可能还都有它自己的变体,比如微软的属性就是以__declspec打头的。因此在C++11中,我们看到了通用属性的出现,C++11标准最终选择创建很少的几个通用属性—noreturn和carrier_dependency。