1.3 C++11特性的分类
从设计目标上说,能够让各个特性协同工作是设计C++11/0x中最为关键的部分。委员会总希望通过特性协作取得整体大于个体的效果,但这也是语言设计过程中最困难的一点。因此相比于其他的各种考虑,WG21更专注于以下理念:
❑保持语言的稳定性和兼容性(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 directlywith hardware)。
❑开发能够改变人们思维方式的特性(Make only changes that change the way peoplethink)。
❑融入编程现实(Fit into the real world)。
根据这些设计理念可以对新特性进行分类。在本书中,我们的核心章节(第2~8章)也会按照这样的方式进行划分。在可能的时候,我们也会为每个理念取个有趣一点儿的中文名字。
而从使用上,Scott Mayers则为C++11创建了另外一种有效的分类方式,Mayers根据C++11的使用者是类的使用者,还是库的使用者,或者特性是广泛使用的,还是库的增强的来区分各个特性。具体地,可以把特性分为以下几种:
❑类作者需要的(class writer,简称为“类作者”)
❑库作者需要的(library writer,简称为“库作者”)
❑所有人需要的(everyone,简称为“所有人”)
❑部分人需要的(everyone else,简称为“部分人”)
那么我们可以结合这种分类再来看一下可以怎样来学习所有的特性。下面我们通过设计理念和用户群对C++11特性进行分类,如表1-3所示。
由于C++11的新特性非常多,因此本书不准备涵盖所有内容。我们粗略地将特性划分为核心语言特性和库特性。而从C++11标准的章节划分来看(读者可以从网站上搜到接近于最终版本的草稿,正式的标准需要通过购买获得),本书将涉及C++11标准中第1~16章的语言特性部分(在C++11语言标准中,第1~16章涵盖了核心语言特性,第17~30章涉及库特性),而标准库将不在本书中描述。当然,这会导致许多灰色地带,因为如同我们提到的,我们总是倾向于使用库而不是语言扩展来实现一些特性,那么实际上,讲解语言核心特性也必然涉及库的内容。典型的,原子操作(atomics)就是这样一个例子。因此,在本书的编写中,我们只是不对标准库进行专门的讲解,而与核心内容相关的库内容,我们还是会有所描述的。
而之前我们提到过的“更倾向于使用库而不是扩展语言来实现特性”理念的部分,如果有可能,我们会在另一本书或者本书的下一个版本中来进行讲解。下面列出了属于该设计理念下的库特性:
❑算法增强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