1.3 C++11/14/17新增的实用特性
C++11标准是C++发展史上具有里程碑意义的一个版本,主要改进了C++98/03标准存在的两大问题。
◎ 废弃了C++98/03标准中一些不实用的语法和库(如 std::auto_ptr),改进或者增强了C++98/03标准中一些语法元素的用法(如auto关键字、统一的类的初始化列表语法),新增了其他编程语言早已支持的关键字和语法(如 final 关键字、=default语法、=delete语法)。
◎ 开始在语法和自带标准库层面增加对操作系统功能的支持(如线程库、时间库)。之前很多功能的实现,C++本身是无法支持的,必须依赖和使用原生操作系统的API函数,导致开发者需要编写大量的平台相关的代码。
随着C++11标准的发展,后续又出现了C++14、C++17及C++20标准,但它们都是对C++11做小范围的修改和扩展,其主要内容还是继续完善一些特性和进一步提高一些标准库的性能。由于C++11新增了大量方便开发的功能与特性,所以支持C++11标准的编译器(如VC++12、g++4.8)一经发布,就立即被广大开发者和使用C++的企业广泛采用。C++11新增的特性确实大大提高了开发效率,使用起来非常方便。
对于 MSVC编译器,支持 C++11新标准的最低版本是 VC++12(随 Visual Studio 2013一起发布,Visual Studio简称VS)。VS 2015支持部分C++14特性,VS 2017支持C++14和部分C++17特性,VS 2019支持C++17大多数语言特性。
对于gcc/g++编译器,支持C++11新标准的最低版本是gcc/g++4.8,支持C++14的版本是gcc/g++4.9,gcc/g++7.3支持C++17的大多数语言特性。
对于某个支持C++11/14/17标准的Visual Studio版本,我们一般不需要做任何特殊设置即可使用新语言标准支持的语法特性和库功能,当然,也可以指定具体的语言规范版本。以Visual Studio 2019为例,新建一个C++项目之后,选中该项目,在弹出的右键菜单中选择Properties菜单项,打开该项目的属性设置对话框,如下图所示。
然后选择菜单“C/C++”→“Language”→“C++Language Standard”,在弹出的下拉菜单中选择需要的C++标准即可,如下图所示。
这里需要说明:Default选项在VS 2019中对应使用 C++14规范标准;对Preview-Features from the latest C++Working Draft(/std:c++latest)选项使用当前最新的C++标准(这里是 C++20),在微软完成 C++20 标准中所有的实现时,这里会多出一个选项,即ISO C++20 Standard(/std:c++20)。
对于gcc/g++编译器(最低版本4.8),如果要使用C++11/14/17语言规范,则需要在编译时设置相应的选项值。例如将 test.cpp文件编译成名为 test的可执行文件,并需要C++11语言规范的支持,则使用:
在使用Makefile文件编译项目时可以这样指定:
在使用cmake编译项目时可以在CMakeLists.txt文件中添加如下行:
对于-std选项的值,可以将其按需设置成c++14或c++17。
对于gcc/g++7.3及以上版本,由于编译器本身就支持包括C++17在内的所有语言特性,因此如果在代码中用到某个特性,则由于编译器本身就支持,可以不必使用-std选项指定具体的语言标准。
C++11/14/17新增的特性非常多,本章接下来会介绍实际开发中高频使用的新语法和新特性。