C++ 的历史

来自cppreference.com
< cpp‎ | language
 
 
C++ 语言
 

早期 C++

  • 1979:首次实现“带类的 C(C with Classes)”
  1. 新特性:成员函数派生类,分离编译,公开与私有访问控制友元,函数实参的类型检查,默认实参内联函数重载赋值运算符构造函数析构函数,f() 与 f(void) 相同,调用的函数与返回的函数(同步特性,不在 C++ 中)
  2. 库:并发任务库(不在 C++ 中)
  • 1982:出版 C with Classes 参考手册
  • 1984:实现 C84,出版参考手册
  • 1985:Cfront 1.0
  1. 新特性:虚函数,函数与运算符的重载引用newdelete 运算符, const 关键词,作用域解析运算符
  2. 库添加:complexstringiostream
  • 1985:《C++ 程序设计语言》(The C++ Programming Language),第 1 版
  • 1986:"whatis?" 提案将剩余的设计目标写入文档,包含多继承,异常处理和模板。
  • 1987:GCC 1.15.3 中加入 C++ 支持
  • 1989:Cfront 2.0
  1. 新特性:多继承成员指针受保护访问,类型安全的连接,抽象类静态const 成员函数,类特有的 newdelete
  2. 库添加:I/O 操纵符
  • 1990:《带标注的 C++ 参考手册》(The Annotated C++ Reference Manual)

此书按设计描述语言,包含一些仍未实现的特性。它在 ISO 标准前作为事实标准。

  1. 新特性:命名空间异常处理嵌套类模板
  • 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)
  1. 新特性:RTTI(dynamic_casttypeid),协变返回类型转型运算符mutablebool,条件中的声明,模板实例化成员模板,export
  2. 库添加:本地环境bitsetvalarrayauto_ptr模板化字符串iostreamcomplex
  3. 基于 STL:容器算法迭代器函数对象
  • 1998 《C++ 程序设计语言》(The C++ Programming Language),第 3 版
  • 1999 委员会成员成立 Boost 以为标准产生高质量的候选库。
  • 2003 C++03(ISO/IEC 14882:2003)

这是一个次要版本,有意稍多于一个技术更正版本

  1. 新特性:值初始化
C++03 中修正的缺陷报告(核心 92 个,库 125 个)

此 TR 讨论各种 C++ 抽象的成本,提供实现指引,讨论 C++ 在嵌入式系统中的使用,并引入到 C 的 ISO/IEC TR 18037:2008 <iohw.h><hardware> 接口。

此 TR 是 C++ 标准库扩展,它添加下列内容到 C++ 标准库:

  1. 来自 Boost:引用包装器智能指针成员函数result_ofbindfunction类型特征随机数,数学特殊函数,tuplearray无序容器(包含 hash)和正则表达式
  2. 来自 C99:C99 中新的来自 math.h 的数学函数,空白字符类浮点环境十六进制浮点的 I/O 操纵符固定大小整型类型long long 类型va_copysnprintf()vfscanf() 函数族及 printf()scanf() 函数族的 C99 转换指定。

除了特殊函数之外的所有 TR1 功能都被包含于 C++11 中,有少量更改。

此国际标准是 C++ 标准库扩展,它添加了曾为 TR1 的一部分,但未包含于 C++11 的特殊函数:椭圆积分,指数积分,拉盖尔多项式,勒让德多项式,埃尔米特多项式,贝塞尔函数,诺依曼函数,beta 函数以及黎曼 zeta 函数。此标准被并入 C++17。

引入大量更改,以标准化既存实践,并改进 C++ 程序员可用的抽象

  1. 新语言特性:autodecltype,预置和弃置的函数,finaloverride尾随返回类型右值引用移动构造函数/移动赋值有作用域 enumconstexpr字面类型列表初始化委托继承的构造函数,花括号或等号初始化器,nullptrlong longchar16_t 与 char32_t类型别名变参模板广义化联合体广义化 PODUnicode 字符串字面量用户定义字面量属性lambda 表达式noexceptalignofalignas,多线程内存模型,线程局域存储GC 接口范围 for(基于 Boost 库),静态断言(基于 Boost 库)
  2. 新库特性:原子操作库,emplace() 和遍及既存标准库所有部分的其他右值引用使用,std::initializer_list,有状态和有作用域分配器,forward_listchrono 库ratio 库,新算法,Unicode 转换平面
  3. 来自 TR1:所有 TR1,除了特殊函数。
  4. 来自 Boost:线程库exception_ptrerror_codeerror_condition,迭代器改进( std::beginstd::endstd::nextstd::prev
  5. 来自 C:C 风格 Unicode 转换函数
C++11 中修正的缺陷报告(核心 741 个,库 685 个)

此 TR 实现来自 IEEE 754-2008 浮点算术标准的十进制浮点类型:std::decimal::decimal32、std::decimal::decimal64 及 std::decimal::decimal128。

C++ 标准的次要版本

  1. 新语言特性:变量模板多态 lambda,lambda 俘获表达式,new/delete 消除,放松 constexpr 函数上的限制二进制字面量,数位分隔符,函数的返回类型推导,带花括号或等号初始化器的类的聚合初始化
  2. 新库特性:std::make_uniquestd::shared_timed_mutexstd::shared_lockstd::integer_sequencestd::exchangestd::quoted 以及许多既存库设施的小改进,例如某些算法的双范围重载,类型特征的类型别名,用户定义的 string,duration 和复数字面量等。
C++14 中修正的缺陷报告(核心 276 个,库 149 个)

此 TS 是实验性 C++ 库扩展,它指定基于 boost.filesystem V3 的文件系统库(有一些修改和扩充)。此 TS 被并入 C++17。

此 TS 为所有标准库算法标准化了并行和向量并行 API,还添加了新算法,例如 reducetransform_reduceexclusive_scan。此 TS 被并入 C++17。

此 TS 扩展了 C++ 核心语言,添加同步和原子块以及事务安全函数,以实现事务性内存语义。

此 TS 添加数个新组件到 C++ 标准库:optionalanystring_viewsamplesearchapply多态分配器和类型特征的变量模板。此 TS 被并入 C++17。

此 TS 扩展了 C++ 核心语言,添加概念(具名类型要求)和制约(模板、函数和变量声明中对允许的类型施加的限制),这有助于元编程并简化模板实例化诊断,见概念。此 TS 已并入 C++20,并有所省略。

此 TS 扩展 C++ 库以包含针对 std::future,闩与屏障,以及原子智能指针的数个扩展

  1. 语言更改:折叠表达式类模板实参推导,auto 非类型模板形参,编译时 if constexprinline 变量结构化绑定ifswitch 的初始化器,u8-char,简化嵌套命名空间using 声明能声明多个名字,令 noexcept 为类型系统的部分,新的求值顺序规则,带显式对齐的分配函数,受保证的复制消除__has_include*this 的 lambda 捕获constexpr lambda属性命名空间不必重复,新属性 [[fallthrough]][[nodiscard]][[maybe_unused]]。移除三标符register 关键词、bool 自增
  2. 库更改: std::variantstd::launder,未初始化内存工具(std::destroy_at/std::destroy/std::destroy_nstd::uninitialized_movestd::uninitialized_value_construct 等),map/set 抽取 及 map/set 合并bytestd::make_from_tuplestd::to_chars/from_chars,文件系统中的相对路径支持( proximaterelativeweakly_canonical),文件系统中的目录项缓存,连续迭代器,非成员 size/empty/data,map/unordered_map try_emplaceinsert_or_assignuncaught_exceptions,变参 lock_guardas_constconjunction/disjunction/negation类型特征变量 xxx_v,透明的 owner_lessdurationtime_point 的舍入函数,std::shared_ptr 的数组支持,not_fnweak_from_thisis_always_lock_freeis_swappableclamp3D hypot缓存线接口is_invocableis_aggregatehas_unique_object_representations。弃用 std::iteratorstd::raw_storage_iteratorstd::get_temporary_bufferstd::is_literal_typestd::result_of,整个 <codecvt>。移除 auto_ptr已弃用的函数对象std::random_shufflestd::unexpected过时的 iostream 别名
  3. 来自 TS:文件系统库,库基础 v1(包含 optionalanystring_view多态分配器搜索器apply),并行 v1(包含执行策略reduceinclusive_scanexclusive_scan),但移除 exception_list。来自数学特殊 TR:特殊数学函数,来自库基础 v2:std::gcdstd::lcm
  4. 来自 C11:std::aligned_allocstd::timespec_get
C++17 中修正的缺陷报告(核心 289 个,库 281 个)

此 TS 扩展 C++ 库,以包含范围——一个新的、更有力的取代迭代器对的抽象,以及范围视图,哨位范围,用于就地变换的投影,新的迭代器及算法。此扩展最终使得能以 sort(v); 排序 vector。

此 TS 扩展 C++ 核心语言及标准库,以包含无栈协程(可恢复函数)。它添加了关键词 co_awaitco_yieldco_return

此 TS 扩展 C++ 库,以包含基于 boost.asio 的 TCP/IP 网络。

此 TS 扩展 C++ 核心语言以包含模块。它添加了关键字 moduleimport,并重新引入带新含义的关键字 export

  • 2018 并行扩展版本 2 TS(ISO/IEC TS 19570:2018)(ISO 商店)(方案

此 TS 扩展 C++ 库,使之包含二个新执行策略(unseqvec),添加 reduction_plusfor_loop_strided 之类的并行算法,分支合并式并行任务的任务块,SIMD 类型及这些类型上的操作。

未来发展

C++ 标准的下个主要版本

  1. 语言更改:三路比较运算符 <=>operator==() = default指派初始化器,范围 for 中的初始化语句和初始化器,char8_t[[no_unique_address]][[likely]][[unlikely]],lambda 俘获中的包展开,在许多语境中移除用 typename 对类型消歧义的要求,consteval,更宽松的 constexpr,有符号整数为补码,使用括号的聚合初始化数组 new 能推导数组大小
  2. 来自 TS:协程,模块,概念,简写的函数模板
  3. 库更改:日历时区库,std::spanstd::endianmake_shared 的数组支持,std::remove_cvrefstd::to_address,浮点及 shared_ptr 原子类型,<version>std::osyncstreamstd::u8string 及其他 char8_t 用具,<algorithm>、<utility>、<complex> 的 constexpr,std::string(_view)::starts_with 及 ends_with,std::assume_alignedstd::bind_frontc8rtomb/mbrtoc8make_obj_using_allocator 等,make_shared_default_init/make_unique_default_init,无序容器中的异质查找等。全特化的 std::polymoprhic_allocator<>std::execution::unseqstd::midpointstd::lerpstd::ssizestd::is_bounded_array
  4. 来自 TS:范围,统一容器擦除 (std::erase/std::erase_if)

参阅

外部链接