C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- 变量模板(C++14 起)
- 整数字面量
- 聚合初始化
- 比较运算符
- 默认比较(C++20 起)
- 转义序列
- for 循环
- while 循环
- 用户定义转换
- SFINAE
- 主函数
- ASCII 码表
- 标识符
- 类型
- 内存模型
- 对象
- 基本概念
- 表达式
- 声明
- 初始化
- 函数
- 语句
- 类
- 运算符重载
- 模板
- 异常
- 事务性内存
- 占位符类型说明符 (C++11 起)
- decltype 说明符
- 函数声明
- final 说明符 (C++11 起)
- override 说明符(C++11 起)
- 引用声明
- 移动构造函数
- 移动赋值运算符
- 枚举声明
- constexpr 说明符(C++11 起)
- 列表初始化 (C++11 起)
- 构造函数与成员初始化器列表
- using 声明
- nullptr,指针字面量
- 基础类型
- 类型别名,别名模版 (C++11 起)
- 形参包
- 联合体声明
- 字符串字面量
- 用户定义字面量 (C++11 起)
- 属性说明符序列(C++11 起)
- Lambda 表达式 (C++11 起)
- noexcept 说明符 (C++11 起)
- noexcept 运算符 (C++11 起)
- alignof 运算符(C++11 起)
- alignas 说明符 (C++11 起)
- 存储类说明符
- 基于范围的 for 循环 (C++11 起)
- static_assert 声明
- 隐式转换
- 代用运算符表示
- 自增/自减运算符
- 折叠表达式(C++17 起)
- 类模板实参推导(C++17 起)
- 模板形参与模板实参
- if 语句
- inline 说明符
- 结构化绑定声明 (C++17 起)
- switch 语句
- 字符字面量
- 命名空间
- 求值顺序
- 复制消除
- consteval 说明符 (C++20 起)
- constinit 说明符 (C++20 起)
- 协程 (C++20)
- 模块 (C++20 起)
- 约束与概念 (C++20 起)
- new 表达式
- do-while 循环
- continue 语句
- break 语句
- goto 语句
- return 语句
- 动态异常说明
- throw 表达式
- try 块
- 命名空间别名
- 类声明
- cv(const 与 volatile)类型限定符
- 默认初始化
- 值初始化(C++03 起)
- 零初始化
- 复制初始化
- 直接初始化
- 常量初始化
- 引用初始化
- 值类别
- C++ 运算符优先级
- 布尔字面量
- 浮点字面量
- typedef 说明符
- 显式类型转换
- static_cast 转换
- dynamic_cast 转换
- const_cast 转换
- reinterpret_cast 转换
- delete 表达式
- 构造函数与成员初始化器列表
- this 指针
- 访问说明符
- 友元声明
- virtual 函数说明符
- explicit 说明符
- 静态成员
- 默认构造函数
- 复制构造函数
- 复制赋值运算符
- 析构函数
- 类模板
- 函数模板
- 显式(全)模板特化
- 汇编声明
- C++ 的历史
- 作用域
- 生存期
- 定义与单一定义规则(ODR)
- 名字查找
- 有限定的名字查找
- 无限定的名字查找
- 如同规则
- 未定义行为
- 翻译阶段
- 常量表达式
- 赋值运算符
- 算术运算符
- 逻辑运算符
- 成员访问运算符
- 其他运算符
- sizeof 运算符
- typeid 运算符
- 指针声明
- 数组声明
- 语言链接
- 详述类型说明符
- 默认实参
- 变长实参
- 实参依赖查找
- 重载决议
- 重载函数的地址
- 注入类名
- 非静态数据成员
- 非静态成员函数
- 嵌套类
- 派生类
- 空基类优化
- 抽象类
- 位域
- 转换构造函数
- 成员模板
- 模板实参推导
- 部分模板特化
- sizeof... 运算符
- 待决名
- 函数 try 块
- 扩充命名空间 std
- 字母缩写
- RAII
- 三/五/零之法则
- PImpl
- 零开销原则
- 类型
- 隐式转换
- 注释
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
C++ 的历史
此书按设计描述语言,包含一些仍未实现的特性。它在 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(2020-01-14 草案)
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
)