1.2.2 C++11语言变化的领域

如果谁说C++11只是对C++语言做了大幅度的改进,那么他很可能就错过了C++11精彩的地方。事实上,读罢本书后,读者只需要看一眼代码,就可以说出代码究竟是C++98/03的,还是C++11的。C++11为程序员创造了很多更有效、更便捷的代码编写方式,程序员可以用简短的代码来完成C++98/03中同样的功能,简单到你惊呼“天哪,怎么能这么简单”。从一些简单的数据统计上看,比起C++98/03,C++11大大缩短了代码编写量,依情况最多可以将代码缩短30%~80%。

那么C++11相对于C++98/03有哪些显著的增强呢?事实上,这包括以下几点:

❑通过内存模型、线程、原子操作等来支持本地并行编程(Native Concurrency)。

❑通过统一初始化表达式、auto、declytype、移动语义等来统一对泛型编程的支持。

❑通过constexpr、POD(概念)等更好地支持系统编程。

❑通过内联命名空间、继承构造函数和右值引用等,以更好地支持库的构建。

表1-2列出了C++11批准通过的,且本书将要涉及的语言特性。这是一张相当长的表,而且一个个陌生的词汇足以让新手不知所措。不过现在还不是了解它们的时候。但看过这张表,读者至少会有这样一种感觉:C++11的确像是一门新的语言。如果我们将C++98/03标准中的特性和C++11放到一起,C++11则像是个恐怖的“编程语言范型联盟”。利用它不仅仅可以写出面向对象语言的代码,也可以写出过程式编程语言代码、泛型编程语言代码、函数式编程语言代码、元编程编程语言代码,或者其他。多范型的支持使得C++11语言的“硬能力”几乎在编程语言中“无出其右”。

1.2.2 C++11语言变化的领域 - 图1

1.2.2 C++11语言变化的领域 - 图2

而从另一个角度看,编程中程序员往往需要将实物、流程、概念等进行抽象描述。但通常情况下,程序员需要抽象出的不仅仅是对象,还有一些其他的概念,比如类型、类型的类型、算法,甚至是资源的生命周期,这些实际上都是C++语言可以描述的。在C++11中,这些抽象概念常常被实现在库中,其使用将比在C++98/03中更加方便,更加好用。从这个角度上讲,C++11则是一种所谓的“轻量级抽象编程语言”(Lightweight Abstraction Programming Language)。其好处就是程序员可以将程序设计的重点更多地放在设计、实现,以及各种抽象概念的运用上。

总的来说,灵活的静态类型、小的抽象概念、绝佳的时间与空间运行性能,以及与硬件紧密结合工作的能力都是C++11突出的亮点。而反观C++98/03,其最强大的能力则可能是体现在能够构建软件基础架构,或构建资源受限及资源不受限的项目上。因此,C++11也是C++在编程语言领域上一次“泛化”与进步。

要实现表1-2中的各种特性,需要编译器完成大量的工作。对于大多数编译器供应商来说,只能分阶段地发布若干个编译版本,逐步支持所有特性(罗马从来就不是一天建成的,对吧)。大多数编译器已经开始了对C++11特性的支持。有3款编译器甚至从2008年前就开始支持C++11了:IBM的XL C/C++编译器从版本10.1开始。GNU的GCC编译器从版本4.3开始,英特尔编译器从版本10.1开始。而微软则从Visual Studio 2010开始。最近,苹果的clang/llvm编译器也从2010年的版本2.8开始支持C++11新特性,并且急速追赶其他编译器供应商。在本书附录C中,读者可以找到现在情况下各种编译器对C++11的支持情况。