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++ 程序中。每种实体的声明方式都不同。定义是足以使该名字所标识的实体被使用的声明。
声明是下列之一:
- 函数定义
 - 模板声明(包括部分模板特化)
 - 显式模板实例化
 - 显式模板特化
 - 命名空间定义
 - 连接说明
 -  属性声明(attr 
;)(C++11 起) -  空声明(
;)(C++11 起) - 无 声明说明符序列 的函数声明:
 
 attr(可选) 声明符 ;
 | 
|||||||||
| attr (C++11 起) | - | 任意数量属性的序列 | 
| 声明符 | - | 函数声明符。 | 
- 块声明(能出现于块中的声明),它可以是下列之一:
 
- 汇编声明
 - 类型别名声明 (C++11 起)
 - 命名空间别名定义
 - using 声明
 - using 指令
 - static_assert 声明 (C++11 起)
 - 不可见 enum 声明 (C++11 起)
 - 简单声明
 
简单声明
简单声明是引入、创建并可选地初始化一个或数个标识符(典型地为变量)的语句。
 声明说明符序列 初始化声明符列表(可选) ;
 | 
(1) | ||||||||
 attr 声明说明符序列 初始化声明符列表;
 | 
(2) | ||||||||
| attr (C++11 起) | - | 任何数量属性的序列 | 
| 声明说明符序列(decl-specifier-seq) | - | 说明符(specifier)的序列(见下文)。 | 
| 初始化声明符列表(init-declarator-list) | - | 带可选的初始化器(initializer)的声明符(declarator)的逗号分隔列表。 初始化声明符列表 在声明具名的 class/struct/union 或具名枚举时是可选的 | 
结构化绑定声明亦为简单声明。 (C++17 起)
说明符
声明说明符(声明说明符序列)是下列以空白分隔的说明符的序列,顺序任意:
-  
typedef说明符。若存在,则整个声明是 typedef 声明,且每个声明符引入一个新的类型名,而非对象或函数。 -  函数说明符(
inline、virtual、explicit),仅在函数声明中允许使用。 
  | 
(C++17 起) | 
-  
friend说明符允许在类和函数声明中使用。 
  | 
(C++11 起) | 
| (C++20 起) | 
-  存储类说明符(register、static、thread_local (C++11 起)、extern、mutable)。仅允许使用一个存储类说明符,但 
thread_local可以与extern或static一同出现。 - 类型说明符(类型说明符序列),指名一个类型的说明符的序列。声明所引入的每个实体均为此类型,可选地为声明符所修饰(见下文)。这个说明符序列也被类型标识(type-id)所用。唯有下列说明符是 类型说明符序列 的一部分,顺序任意:
 
| (C++11 起) | 
| (C++17 起) | 
- 
 - 每个 声明说明符序列 中只允许一个类型说明符,但有以下例外:
 - - 
const能与自身外的任何类型说明符组合。 - - 
volatile能与自身外的任何类型说明符组合。 - - 
signed或unsigned能与char、long、short或int组合。 - - 
short或long能与int组合。 - - 
long能与double组合。 
  | 
(C++11 起) | 
属性可出现于 声明说明符序列 中,该情况下它们应用于其之前的说明符所确定的类型。
| 
 声明说明符序列 中仅有的允许两次出现的说明符是   | 
(C++17 起) | 
声明符
初始化声明符列表(init-declarator-list)是一或多个 初始化声明符(init-declarator) 的逗号分隔列表,它拥有下列语法:
| 声明符 初始化器(可选) | (1) | ||||||||
| 声明符 requires-子句 | (2) | (C++20 起) | |||||||
| 声明符(declarator) | - | 声明符 | 
| 初始化器(initializer) | - | 可选的初始化器(除非在必要的场合,例如初始化引用或 const 对象时)。细节见初始化。 | 
| requires-子句(C++20) | - | requires 子句,向函数声明添加制约 | 
初始化声明符序列 S D1, D2, D3; 中的每个 初始化声明符,均按照如同它是拥有相同说明符的孤立声明来处理:S D1; S D2; S D3;。
每个声明符恰好引入一个对象、引用、函数或(对于 typedef 声明)类型别名,其类型由 声明说明符序列 提供,并可选地被声明符中的运算符,如 &(~的引用)或 [](~的数组)或 ()(返回~的函数)所修饰。可以递归应用这些声明符,如下所示。
声明符 是下列之一:
| 无限定标识 attr(可选) | (1) | ||||||||
| 有限定标识 attr(可选) | (2) | ||||||||
 ... 标识符 attr(可选)
 | 
(3) | (C++11 起) | |||||||
 * attr(可选) cv(可选) 声明符
 | 
(4) | ||||||||
 嵌套名说明符 * attr(可选) cv(可选) 声明符
 | 
(5) | ||||||||
 & attr(可选) 声明符
 | 
(6) | ||||||||
 && attr(可选) 声明符
 | 
(7) | (C++11 起) | |||||||
 noptr-声明符 [ constexpr(可选) ] attr(可选)
 | 
(8) | ||||||||
 noptr-声明符 ( 形参列表 ) cv(可选) ref(可选) 异常说明(可选) attr(可选)
 | 
(9) | ||||||||
所有情况下,attr 均为可选的属性的序列。当其紧跟标识符之后出现时,它应用于所声明的对象。
cv 是 const 与 volatile 限定符的序列,其中任一限定符在序列中至多出现一次。
| 本节未完成 原因:解释名字隐藏规则;变量/函数声明如何隐藏同名的类(而非 typedef)  | 
注解
块声明出现在代码块内,而当声明中引入的标识符之前已在某个外层代码块中声明时,该代码块的剩余部分中外层声明被隐藏。
若声明引入具有自动存储期的变量,则它在执行其声明语句时初始化。退出代码块时,所有声明于该块中的自动变量被以其初始化顺序的相反顺序销毁(无关乎如何退出代码块:通过异常、goto 或抵达其结尾)。
示例
class C { std::string member; // 声明说明符序列 为 "std::string" // 声明符 为 "member" } obj, *pObj(&obj); // 声明说明符序列 为 "class C { std::string member; }" // 声明符 "obj" 定义 C 类型的对象 // 声明符 "*pObj(&obj)" 声明并初始化指向 C 的指针 int a = 1, *p = nullptr, f(), (*pf)(double); // 声明说明符序列 为 int // 声明符 a=1 定义并初始化 int 类型的变量 // 声明符 *p=NULL 定义并初始化 int* 类型的变量 // 声明符 (f)() 声明(但不定义)不接收参数并返回 int 的函数 // 声明符 (*pf)(double) 定义指向接收 double 并返回 int 的函数的指针 int (*(*foo)(double))[3] = nullptr; // decl-specifier-seq 为 int // 1. 声明符 "(*(*foo)(double))[3]" 是数组声明符; // 所声明类型是“int 的 3 元素数组 /嵌套声明符/ ” // 2. 嵌套声明符是 "(*(*foo)(double))",它是指针声明符 // 所声明类型是“int 的 3 元素数组 的指针 /嵌套声明符/” // 3. 嵌套声明符是 "(*foo)(double)",它是函数声明符 // 所声明类型是“以 int 的 3 元素数组 的指针 为返回值的接受一个 double 参数的函数 /嵌套声明符/” // 4. 嵌套声明符是 "(*foo)",它是(带括号,如函数声明符语法所要求的)指针声明符。 // 所声明类型是“以 int 的 3 元素数组 的指针 为返回值的接受一个 double 参数的函数 的指针 /嵌套声明符/” // 5. 嵌套声明符是 "foo",它是标识符。 // 该声明声明了对象 foo,其类型为“以 int 的 3 元素数组 的指针 为返回值的接受一个 double 参数的函数 的指针” // 初始化器 "= nullptr" 提供此指针的初值。