1.3 拥抱C++新变化(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++14、C++17以及现在最新的C++20标准,但它们都是对C++11作小范围的修改和扩展,其主要内容还是继续完善一些特性和进一步提高一些标准库的性能。由于C++ 11新增了大量方便开发的功能与特性,支持C++11标准的编译器(如VC++12、g++ 4.8)一经发布,立即被广大开发者和使用C++的企业广泛采用。笔者也在 C++11 发布以后将自己的个人和公司项目全部使用C++11语法重构了一遍,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语法特性和标准库支持情况,完整列表可参考https://en.cppreference.com/w/cpp/compiler_support (opens new window)。
对于某个支持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),当Microsoft完成C++20标准中所有的实现时,这里会多出一个选项,即ISO C++20 Standard(/std:c++20)。
对于gcc/g++编译器(最低版本4.8),如果要使用C++11/14/17语言规范,则需要在编译时设置相应的选项值。例如将test.cpp文件编译成名为test的可执行文件,同时需要C++ 11语言规范支持,则使用:
g++ -g -o test test.cpp -std=c++11
在使用Makefile文件编译项目时可以这样指定:
make CXXFLAGS="-g -O0 -std=c++11"
在使用cmake编译项目时可以在CMakeLists.txt文件中添加如下行:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -Wall -O0 -Wno-unused-variable")
-std 选项的值可以按需设置成 c++14 或 c++17。
对于gcc/g++ 7.3及以上版本,由于编译器本身就支持包括C++17在内的所有语言特性,因此如果代码中用到某个特性,由于编译器本身就支持,可以不必使用 -std 选项指定具体的语言标准。
C++11/14/17新增的特性非常多,本章接下来会介绍一些实际开发中高频使用的新语法和新特性。