C++ 的历史
早期 C++
- 1979:首次实现“带类的 C(C with Classes)”
- 新特性:类,成员函数,派生类,分离编译,公开与私有访问控制,友元,函数实参的类型检查,默认实参,内联函数,重载赋值运算符,构造函数,析构函数,f() 与 f(void) 相同,调用的函数与返回的函数(同步特性,不在 C++ 中)
- 库:并发任务库(不在 C++ 中)
- 1982:出版 C with Classes 参考手册
- 1984:实现 C84,出版参考手册
- 1985:Cfront 1.0
- 1985:《C++ 程序设计语言》(The C++ Programming Language),第 1 版
- 1986:"whatis?" 提案将剩余的设计目标写入文档,包含多继承,异常处理和模板。
- 1987:GCC 1.15.3 中加入 C++ 支持
- 1989:Cfront 2.0
- 1990:《带标注的 C++ 参考手册》(The Annotated C++ Reference Manual)
此书按设计描述语言,包含一些仍未实现的特性。它在 ISO 标准前作为事实标准。
- 1991:Cfront 3.0
- 1991:《C++ 程序设计语言》(The C++ Programming Language),第 2 版
标准 C++
- 1990 ANSI C++ 委员会成立
- 1991 ISO C++ 委员会成立
- 1992 STL 以 C++ 实现
- 1998
C++98
(ISO/IEC 14882:1998)
- 新特性:RTTI(dynamic_cast、typeid),协变返回类型,转型运算符,mutable,bool,条件中的声明,模板实例化,成员模板,export
- 库添加:本地环境,bitset,valarray,auto_ptr,模板化字符串,iostream 及 complex。
- 基于 STL:容器,算法,迭代器,函数对象
- 1998 《C++ 程序设计语言》(The C++ Programming Language),第 3 版
- 1999 委员会成员成立 Boost 以为标准产生高质量的候选库。
- 2003
C++03
(ISO/IEC 14882:2003)
这是一个次要版本,有意稍多于一个技术更正版本
- 新特性:值初始化
此 TR 讨论各种 C++ 抽象的成本,提供实现指引,讨论 C++ 在嵌入式系统中的使用,并引入到 C 的 ISO/IEC TR 18037:2008 <iohw.h>
的 <hardware>
接口。
此 TR 是 C++ 标准库扩展,它添加下列内容到 C++ 标准库:
- 来自 Boost:引用包装器,智能指针,成员函数,result_of,bind,function,类型特征,随机数,数学特殊函数,tuple,array,无序容器(包含 hash)和正则表达式。
- 来自 C99:C99 中新的来自 math.h 的数学函数,空白字符类,浮点环境,十六进制浮点的 I/O 操纵符,固定大小整型类型,long long 类型,va_copy,snprintf() 和 vfscanf() 函数族及 printf() 和 scanf() 函数族的 C99 转换指定。
除了特殊函数之外的所有 TR1 功能都被包含于 C++11 中,有少量更改。
此国际标准是 C++ 标准库扩展,它添加了曾为 TR1 的一部分,但未包含于 C++11 的特殊函数:椭圆积分,指数积分,拉盖尔多项式,勒让德多项式,埃尔米特多项式,贝塞尔函数,诺依曼函数,beta 函数以及黎曼 zeta 函数。此标准被并入 C++17。
引入大量更改,以标准化既存实践,并改进 C++ 程序员可用的抽象
- 新语言特性:auto 和 decltype,预置和弃置的函数,final 和 override,尾随返回类型,右值引用,移动构造函数/移动赋值,有作用域 enum,constexpr 和字面类型,列表初始化,委托和继承的构造函数,花括号或等号初始化器,nullptr,long long,char16_t 与 char32_t,类型别名,变参模板,广义化联合体,广义化 POD,Unicode 字符串字面量,用户定义字面量,属性,lambda 表达式,noexcept,alignof 与 alignas,多线程内存模型,线程局域存储,GC 接口,范围 for(基于 Boost 库),静态断言(基于 Boost 库)
- 新库特性:原子操作库,emplace() 和遍及既存标准库所有部分的其他右值引用使用,std::initializer_list,有状态和有作用域分配器,forward_list,chrono 库,ratio 库,新算法,Unicode 转换平面
- 来自 TR1:所有 TR1,除了特殊函数。
- 来自 Boost:线程库,exception_ptr,error_code 和 error_condition,迭代器改进( std::begin、std::end、std::next、std::prev)
- 来自 C:C 风格 Unicode 转换函数
此 TR 实现来自 IEEE 754-2008 浮点算术标准的十进制浮点类型:std::decimal::decimal32、std::decimal::decimal64 及 std::decimal::decimal128。
- 2012 标准 C++ 基金会成立
- 2013 《C++ 程序设计语言》(The C++ Programming Language),第 4 版
- 2014
C++14
(ISO 商店)(ANSI 商店)( 2014 最终方案)
C++ 标准的次要版本
- 新语言特性:变量模板,多态 lambda,lambda 俘获表达式,new/delete 消除,放松 constexpr 函数上的限制,二进制字面量,数位分隔符,函数的返回类型推导,带花括号或等号初始化器的类的聚合初始化。
- 新库特性:std::make_unique,std::shared_timed_mutex 及 std::shared_lock,std::integer_sequence,std::exchange,std::quoted 以及许多既存库设施的小改进,例如某些算法的双范围重载,类型特征的类型别名,用户定义的 string,duration 和复数字面量等。
此 TS 是实验性 C++ 库扩展,它指定基于 boost.filesystem V3 的文件系统库(有一些修改和扩充)。此 TS 被并入 C++17。
此 TS 为所有标准库算法标准化了并行和向量并行 API,还添加了新算法,例如 reduce
、transform_reduce
和 exclusive_scan
。此 TS 被并入 C++17。
此 TS 扩展了 C++ 核心语言,添加同步和原子块以及事务安全函数,以实现事务性内存语义。
此 TS 添加数个新组件到 C++ 标准库:optional,any,string_view,sample,search,apply,多态分配器和类型特征的变量模板。此 TS 被并入 C++17。
此 TS 扩展了 C++ 核心语言,添加概念(具名类型要求)和制约(模板、函数和变量声明中对允许的类型施加的限制),这有助于元编程并简化模板实例化诊断,见概念。此 TS 已并入 C++20,并有所省略。
此 TS 扩展 C++ 库以包含针对 std::future,闩与屏障,以及原子智能指针的数个扩展。
- 2017
C++17
(ISO 商店)(ANSI 商店)(n4659(2017-03-21 最终草案))
- 语言更改:折叠表达式,类模板实参推导,auto 非类型模板形参,编译时 if constexpr,inline 变量,结构化绑定,if 和 switch 的初始化器,u8-char,简化嵌套命名空间,using 声明能声明多个名字,令 noexcept 为类型系统的部分,新的求值顺序规则,带显式对齐的分配函数,受保证的复制消除,__has_include,*this 的 lambda 捕获,constexpr lambda,属性命名空间不必重复,新属性
[[fallthrough]]
、[[nodiscard]]
及[[maybe_unused]]
。移除三标符, register 关键词、bool 自增 - 库更改: std::variant,std::launder,未初始化内存工具(std::destroy_at/std::destroy/std::destroy_n、std::uninitialized_move、std::uninitialized_value_construct 等),map/set 抽取 及 map/set 合并,byte,std::make_from_tuple,std::to_chars/from_chars,文件系统中的相对路径支持( proximate、relative、weakly_canonical),文件系统中的目录项缓存,连续迭代器,非成员 size/empty/data,map/unordered_map try_emplace 及 insert_or_assign,uncaught_exceptions,变参 lock_guard,as_const,conjunction/disjunction/negation,类型特征变量 xxx_v,透明的 owner_less,duration 和 time_point 的舍入函数,std::shared_ptr 的数组支持,not_fn,weak_from_this,is_always_lock_free,is_swappable,clamp,3D hypot,缓存线接口,is_invocable,is_aggregate,has_unique_object_representations。弃用
std::iterator
,std::raw_storage_iterator
,std::get_temporary_buffer
,std::is_literal_type
,std::result_of
,整个<codecvt>
。移除 auto_ptr,已弃用的函数对象,std::random_shuffle,std::unexpected,过时的 iostream 别名。 - 来自 TS:文件系统库,库基础 v1(包含 optional、any、string_view、多态分配器、搜索器、apply),并行 v1(包含执行策略、reduce、inclusive_scan、exclusive_scan),但移除
exception_list
。来自数学特殊 TR:特殊数学函数,来自库基础 v2:std::gcd、std::lcm - 来自 C11:std::aligned_alloc,std::timespec_get
此 TS 扩展 C++ 库,以包含范围——一个新的、更有力的取代迭代器对的抽象,以及范围视图,哨位范围,用于就地变换的投影,新的迭代器及算法。此扩展最终使得能以 sort(v); 排序 vector。
此 TS 扩展 C++ 核心语言及标准库,以包含无栈协程(可恢复函数)。它添加了关键词 co_await、co_yield 及 co_return。
此 TS 扩展 C++ 库,以包含基于 boost.asio 的 TCP/IP 网络。
此 TS 扩展 C++ 核心语言以包含模块。它添加了关键字 module、import,并重新引入带新含义的关键字 export。
此 TS 扩展 C++ 库,使之包含二个新执行策略(unseq 与 vec),添加 reduction_plus 或 for_loop_strided 之类的并行算法,分支合并式并行任务的任务块,SIMD 类型及这些类型上的操作。
未来发展
- 实验性技术规范
- 2020 C++20(2019-11-27 草案)
C++ 标准的下个主要版本
- 语言更改:三路比较运算符 <=> 及 operator==() = default,指派初始化器,范围 for 中的初始化语句和初始化器,char8_t,
[[no_unique_address]]
,[[likely]]
,[[unlikely]]
,lambda 俘获中的包展开,在许多语境中移除用typename
对类型消歧义的要求,consteval
,更宽松的 constexpr,有符号整数为补码,使用括号的聚合初始化,数组 new 能推导数组大小 - 来自 TS:协程,模块,概念,简写的函数模板
- 库更改:日历和时区库,std::span,std::endian,make_shared 的数组支持,std::remove_cvref,std::to_address,浮点及 shared_ptr 原子类型,
<version>
,std::osyncstream,std::u8string 及其他 char8_t 用具,<algorithm>、<utility>、<complex> 的 constexpr,std::string(_view)::starts_with 及 ends_with,std::assume_aligned,std::bind_front,c8rtomb/mbrtoc8,make_obj_using_allocator 等,make_shared_default_init/make_unique_default_init,无序容器中的异质查找等。全特化的 std::polymoprhic_allocator<>,std::execution::unseq,std::midpoint 与 std::lerp,std::ssize,std::is_bounded_array。 - 来自 TS:范围,统一容器擦除 (
std::erase
/std::erase_if
)