回想1999年就开始学习C语言,C++主要用C++98,C++11这两个版本,开发软件从TurboC2.0、TurboC++3.0,到Visual C++、Visual Studio、Xcode等,从16年后逐渐用C/C++也少了,代码写得少了,而更喜欢使用Python、js等脚本语言,省心省力。
整个软件开发行业用C/C++的也越来越少,但一些重要的地方仍然少了它的身影,C++标准也在发展,今天理一理C++的发展史,我似乎看到C++在不同年代的照片,如同昨天旅游时找出14年的照片,一张张的复刻,复刻的时光,意味着时间的流逝,意味着我们的老去!
初览
C++ 的国际标准有 5 个版本,1998, 2003, 2011, 2014, 2017
C++98
C++98是第一个正式C++标准,C++03是在C++98上面进行了小幅度的修订,其实C++在第一个标准C++98之前就已经广为使用了。
只不过那时候还没有一个官方的统一标准,后来才开始起草标准草案,起草了n年,直到98年才最终发布。(所以你可以看到一些早期的C++编译器对标准的支持程度很差,比如经典的VC6.0,在研发的时候C++的第一个标准还没公布呢)
至于什么C89、C99这些,是C语言的标准,不是C++的标准,很容易被一些人混淆。
C++03
C++03 是给 C++98 打的补丁,所以现在的人提到 C++98, C++03 往往指的是同一个。
C++11
C++11则是一次全面的大进化(之前称C++11为C++0x,以为会在08~09年公布,没想到拖到了11年)。
关键字及新语法
1.1. auto 关键字及用法
1.2. nullptr 关键字及用法
1.3. for 循环语法
STL 容器
2.1. std::array
2.2. std::forward_list
2.3. std::unordered_map
2.4. std::unordered_set
多线程
3.1. std::thread
3.2. std::atomic
3.3. std::condition_variable
智能指针内存管理
4.1. std::shared_ptr
4.2. std::weak_ptr
其他
5.1. std::function、std::bind 封装可执行对象
5.2. lambda 表达式
C++14
C++14旨在作为C++11的一个小扩展,主要提供漏洞修复和小的改进。
1 新的语言特性
1.1 泛型的lambda
1.2 Lambda捕获部分中使用表达式
1.3 函数返回类型推导
1.4 另一种类型推断
1.5 放松的constexpr限制
1.6 变量模板
1.7 聚合体成员初始化
1.8 二进制字面量
1.9 数字分位符
2 新的标准库特性
2.1 共享的互斥体和锁
2.2 元函数的别名
2.3 关联容器中的异构查找
2.4 标准自定义字面量
2.5 通过类型寻址多元组
2.6 较小的标准库特性
3 已被移除或是不包含在C++14标准的特性
3.1 关于数组的扩展
3.2 Optional值
3.3 Concepts Lite
C++17
1 关键字
1.1 constexpr
1.2 static_assert
1.3 auto
1.4 typename
1.5 inline
2 语法
2.1 折叠表达式
2.2 结构化绑定
2.3 允许非类型模板参数进行常量计算
2.4 条件分支语句初始化
2.5 聚合初始化
2.6 嵌套命名空间
2.7 lambda表达式捕获*this的值
2.8 枚举[类]对象的构造
2.9 十六进制单精度浮点数字面值
2.10 基于对齐内存的动态内存分配
2.11 细化表达式的计算顺序
2.12 模板类的模板参数自动推导
2.13 简化重复命名空间的属性列表
2.14 不支持、非标准的属性
2.15 改写与继承构造函数
2.16 内联变量
2.17 用auto作为非类型模板参数
3 宏
3.1 __has_include
4 属性
4.1 fallthrough
4.2 nodiscard
4.3 maybe_unuse
C++20
C++20 的 Big Four(四大新特性:概念、范围、协程和模块)以及核心语言(包括一些新的运算符和指示符)。
1 关键字
1.1 concept
1.2 requires
1.3 typename
1.4 explicit
1.5 constexpr
1.6 char8_t
1.7 consteval
1.8 co_await、co_yield、co_return
1.9 constinit
2 语法
2.1 位域变量的默认成员初始化
2.2 修改const限定的成员指针
2.3 允许lambda表达值按值捕获this
2.4 指定初始化
2.5 lambda表达式支持模板
2.6 从构造函数推导出模板参数类型
2.7 基于范围的for循环初始化
2.8 简化lambda的隐式捕获
2.9 ADL与不可见的模板函数
2.10 operator<=>
2.11 基于范围的for循环初始化
2.12 默认可构造可分配的无状态lambdas
2.13 专门的访问检查
2.14 constexpr函数的实例化
2.15 允许lambda在初始化捕获时进行包扩展
2.16 放宽结构化绑定,新增自定义查找规则
2.17 放宽基于范围的for循环,新增自定义范围方法
2.18 类类型的非类型模板参数
关于类类型的非类型模板参数的优化
类类型的非类型模板参数的条件(满足任意一个):
2.19 禁止使用用户自己声明的构造函数来进行聚合初始化
旧版的几个问题
解决方案
2.20 嵌套内联命名空间
2.21 约束声明的另一种办法
2.22 允许在常量表达式中使用dynamic_cast多台typeid
2.23 允许用圆括弧的值进行聚合初始化
2.24 new表达式的数组元素个数的推导
2.25 unicode字符串字面量
2.26 允许转换成未知边界的数组
2.27 聚合初始化推导类模板参数
2.28 隐式地将返回的本地变量转换为右值引用
2.29 允许default修饰运算符按值比较
2.30 非类型模板参数等效的条件
3 宏
4 属性
4.1 likely和unlikely
4.2 no_unique_address
4.3 nodiscard
5 弃用
5.1 lambda弃用使用[=]来隐式捕获this
5.2 比较运算符的改进
5.3 弃用下标表达式中的逗号操作符
9月4日,C++20 的国际标准草案(DIS, Draft International Standard)投票结束,最终获全票批准通过。
这意味着 C++20 已获得了最终的技术批准,并完成了 ISO 的投票,预计在完成最后一轮 ISO 的编辑工作后,C++20 将在2020年底正式发布。
C++23
进度表和计划中...