1、C++11
2011 年 8 月 12 日,ISO(国际标准化组织)批准了 C++ 的新版本,称为 C++11。 C++11 为 C++ 语言添加了一组全新的特性! 其中一些新功能很有帮助。
(1)C++11的目标和设计
Bjarne Stroustrup 将 C++11 的目标描述为:
1、建立在 C++ 的优势之上——与其试图将 C++ 扩展到它可能较弱的新领域(例如,具有大量 GUI 的 Windows 应用程序),不如专注于让它做得更好。
2、使 C++ 更易于学习、使用和教授——提供使语言更一致和更易于使用的功能。
为此,遵守以下一般原则:
1、尽可能保持与旧版本 C++ 和 C 的稳定性和兼容性。在 C++03 下运行的程序通常仍应在 C++11 下运行。
2、将核心语言扩展的数量保持在最低限度,并将大部分更改放在标准库中(此版本没有很好地满足这个目标)。
3、专注于改进抽象机制(类、模板),而不是添加机制来处理特定的、孤立的情况。
4、为新手和专家添加新功能。
5、增加类型安全性,以防止无意的错误。
6、提高性能并允许 C++ 直接与硬件一起工作。
7、考虑可用性和生态系统问题。 C++ 需要与其他工具很好地协同工作,易于使用和教授,等等……
C++11 在主模块上与 C++03 并没有太大的不同,但它确实增加了大量的新功能。
(2)C++11 的主要新特性
这里列出了 C++11 添加的主要功能。 此列表并不全面。
auto(使用 auto 关键字对对象进行类型推导)
char16_t 和 char32_t 以及支持它们的新文字
constexpr (符号常量:const 和 constexpr 变量)
decltype
默认说明符
委托构造函数(重叠和委托构造函数)
删除说明符(转换构造函数,显式和删除)
枚举类(作用域枚举(枚举类))
外部模板
Lambda 表达式(lambda 简介(匿名函数))和捕获(12.8 - Lambda 捕获)
long long int(对象大小和 sizeof 运算符)
移动构造函数和赋值(移动构造函数和移动赋值)
Noexcept 说明符(未捕获的异常和包罗万象的处理程序)
nullptr (空指针)
覆盖和最终说明符(覆盖和最终说明符以及协变返回类型)
基于范围的 for 语句(For-each 循环)
r 值引用(R 值引用)
static_assert (断言和静态断言)
std::initializer_list (std::initializer_list )
尾随返回类型语法(使用 auto 关键字的对象类型推导)
类型别名(Typedefs 和类型别名)
typedef 现在可以 typedef 模板类
统一初始化
用户定义的文字
可变参数模板
>> 现在将被正确解释为关闭模板对象
C++ 标准库中还有许多新类可供使用。
更好地支持多线程和线程本地存储
哈希表
随机数生成改进(使用 Mersenne Twister 生成随机数)
参考包装器(对象切片)
正则表达式
std::auto_ptr 已被弃用(智能指针和移动语义介绍)
std::tuple(按引用返回和按地址返回)
std::unique_ptr
2、C++14
2014 年 8 月 18 日,ISO(国际标准化组织)批准了 C++ 的新版本,称为 C++14。 与添加大量新功能的 C++11 不同,C++14 是一个相对较小的更新,主要包括错误修复和小改进。
这里列出了 C++14 添加的主要改进。此列表并不全面。
聚合成员初始化(结构、成员和成员选择简介)
二进制文字(文字常量)
[[deprecated]] 属性
数字分隔符(文字常量)
函数返回类型推导(使用 auto 关键字对对象进行类型推导)
Generic lambdas (Introduction to lambdas (anonymous functions))
宽松的 constexpr 函数(Consexpr 和 consteval 函数)
变量模板
std::make_unique
3、C++17
2017 年 9 月,ISO(国际标准化组织)批准了 C++ 的新版本,称为 C++17。 C++17 包含大量新内容。
这里列出了 C++17 添加的主要改进。 此列表并不全面。
__has_include 预处理器标识符,用于检查可选头文件是否可用
在编译时解析的 if 语句
if 语句和 switch 语句中的初始化器
内联变量(跨多个文件共享全局常量(使用内联变量))
折叠表达式
嵌套命名空间现在可以定义为命名空间 X::Y (用户定义的命名空间和范围解析运算符)
删除 std::auto_ptr 和其他一些不推荐使用的类型
static_assert 不再需要诊断文本消息参数(Assert 和 static_assert)
std::any
std::byte
std::filesystem
std::optional
std::shared_ptr 现在可以管理 C 样式数组(但 std::make_shared 还不能创建它们)
std::size (数组 (第二部分))
std::string_view
结构化绑定声明
构造函数的模板推导
三元组已被删除
typename 现在可以在模板模板参数中使用(而不是类)
UTF-8 (u8) 字符文字
4、C++20
2020 年 2 月,ISO(国际标准化组织)批准了新版本的 C++,称为 C++20。 C++20 包含自 C++11 以来对该语言的最大更改。
这里列出了 C++20 添加的主要改进。此列表并不全面。
通过自动参数的缩写函数模板(具有多种模板类型的函数模板)
日历和时区支持的 Chrono 扩展
概念,允许您对模板参数施加约束
Constexpr 虚函数、联合、try、catch、dynamic_cast 和 typeid
Constinit 关键字,断言变量具有静态初始化
协程
指定初始化器(结构聚合初始化)
使用 consteval 关键字的立即函数(Constexpr 和 consteval 函数)
模块,#include 的替代品
范围
std::erase
std::make_shared 用于数组
std::map::contains()
std::span
字符串格式化库(还没有教程,请参阅 https://en.cppreference.com/w/cpp/utility/format)
字符串文字作为模板参数
使用 spaceship 运算符 <=> 进行三向比较
使用范围枚举
视图