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++ 关键词
标识符
一个标识符是一个由数字,下划线,小写和大写拉丁字母,和大多数 Unicode 字符(见下文的详细说明)组成的任意长度的序列。有效的标识符必须以一个非数字字符(拉丁语字母,下划线或 Unicode 非数字字符)开头。标识符区分大小写(小写和大写字母是不同的),而且每一个字符都是起作用的。
注意:C++ 的文法中形式上要求 Unicode 字符以 \u
或 \U
进行转义,但根据翻译阶段 1 ,这只不过是将源代码中的原始 Unicode 字符呈现给编译器的方式。还要注意的是,对这个功能特性的支持可能是有限的,比如 gcc
在声明中
可以用标识符来命名对象、引用、函数、枚举项、类型、类成员、命名空间、模板、模板特化、形参包、goto 标号,以及其他实体,但有以下例外:
- 关键词标识符不能用于其他目的;
- 其中任何位置带有双下划线的标识符都是被保留的;
- 以一个下划线跟着一个大写字母开头的标识符是被保留的;
- 以一个下划线开头的标识符在全局命名空间中是被保留的。
这里“被保留”的意思是,标准库的头文件可能 #define 或者声明这样的标识符以便其内部使用,编译器可能会预先定义这种非标准的标识符,而且名字重整算法可能会假定某些这样的标识符是没有被使用的。如果程序员使用了这样的标识符的话,其行为是未定义的。
此外,对等同于关键词的标识符进行 #define 或 #undef,是未定义行为。一旦包含了至少一个标准库头文件,对等同于由任何标准库头文件中声明的名字的标识符进行 #define 或 #undef,也是未定义行为。
本节未完成 原因:添加 17.6.4.3 [reserved.names] 的内容 |
在表达式中
指名某个变量、函数、概念的特化 (C++20 起)或枚举项的标识符可以作为表达式使用。仅由这个标识符组成的表达式的结果,是该标识符所指名的实体。若该标识符指名的是某个函数、变量、模板形参对象 (C++20 起)或数据成员,则表达式的值类别为左值,否则为纯右值(例如枚举项是纯右值表达式,概念的特化是 bool 纯右值 (C++20 起))。该表达式的类型以下列方式确定:
void f() { float x, &r = x; [=] { decltype(x) y1; // y1 拥有 float 类型 decltype((x)) y2 = y1; // y2 拥有 float const& 类型 // 因为此 lambda 非 mutable 而 x 是左值 decltype(r) r1 = y1; // r1 拥有 float& 类型 decltype((r)) r2 = y2; // r2 拥有 float const& 类型 }; } |
(C++11 起) |
|
(C++20 起) |
- 否则,表达式的类型与被指名的实体的类型相同。
在非静态成员函数体内,指名非静态成员的每个标识符,都隐含地变换成一个类成员访问表达式 this->member 。
无限定的标识符
除了适当声明了的标识符之外,以下各项也可以以相同方式用在表达式中:
- 函数写法的重载运算符名,比如 operator+ 或 operator new ;
- 用户定义转换函数的名字,比如 operator bool ;
- 用户定义字面量运算符的名字,比如 operator "" _km ;
- 模板的名字后随其实参列表,比如 MyTemplate<int> ;
- ~ 字符后随类名,比如 ~MyClass;
- ~ 字符后随 decltype 说明符,比如 ~decltype(str) 。
这些和标识符一起,被称作无限定的标识表达式。
有限定的标识符
有限定的标识表达式是在无限定的标识表达式前面带上作用域解析运算符 ::,以及可选地带上一系列以作用域解析运算符分隔的 枚举 (C++11 起)、类或命名空间的名字,或者 decltype 表达式 (C++11 起)。例如,表达式 std::string::npos 是指名命名空间 std 中的类 string 中的静态成员 npos 的表达式。表达式 ::tolower 指名的是全局命名空间中的函数 tolower 。表达式 ::std::cout 指名 std 命名空间(顶层命名空间)中的全局变量 cout 。表达式 boost::signals2::connection 指名的是声明于 signals2 命名空间中的类型 connection ,前者则声明于命名空间 boost 。
有限定标识符中,可能会需要以关键词 template 来消除待决模板名的歧义。
有关为有限定的标识符进行的名字查找的细节,请参见有限定的名字查找。
名字
名字是以下各项之一,用来代表某个实体或者某个标号:
- 标识符;
- 函数写法的重载运算符的名字( operator+ 、 operator new );
- 用户定义的转换函数的名字( operator bool );
- 用户定义的字面量运算符的名字( operator "" _km );
- 模板的名字后随其实参列表( MyTemplate<int> )。
代表实体的名字都是由声明引入到程序中来的。代表标号的名字则既可以通过 goto 语句,也可以通过带标号语句引入到程序中来。在多个翻译单元中使用一个名字,可以代表相同或者不同的实体,这依赖于其连接。
每当编译器在程序中遇到一个未知的名字时,它就会通过进行名字查找来将之与引入这个名字的声明联系起来,但对模板的声明和定义中的待决名不会这样做(对于这些名字,编译器需要确定它们所指名的是类型、模板还是别的什么实体,这可能需要进行显式消歧义)。
标识符中的 Unicode 字符
允许在标识符中使用下列 Unicode 字符范围:
代码点 | 说明 | 字符 |
---|---|---|
U+00A8 | 分音符 | ¨
|
U+00AA | 阴性顺序指示符 | ª
|
U+00AD | 软连字符 |
|
U+00AF | 长音符 | ¯
|
U+00B2 - U+00B5 | 上标二 - 微符 | ²³´µ
|
U+00B7 - U+00BA | 中间点 - 阳性顺序指示符 | ·¸¹º
|
U+00BC - U+00BE | 普通分数四分之一 - 普通分数四分之三 | ¼½¾
|
U+00C0 - U+00D6 | 带抑音符的拉丁文大写字母 A - 带分音符的拉丁文大写字母 O | ÀÁÂ...ÔÕÖ
|
U+00D8 - U+00F6 | 带粗线的拉丁文大写字母 O - 带分音符的拉丁文小写字母 O | ØÙÚ...ôõö
|
U+00F8 - U+167F | 带粗线的拉丁文小写字母 O - 加拿大印第安方言领音 W (阿尔滚琴语) | øùú...ᙽᙾᙿ
|
U+1681 - U+180D | 欧甘文字母 Beith - 蒙古语自由变体选择符三 | ᚁᚂᚃ...᠋᠌᠍
|
U+180F - U+1FFE | 叙利亚文字母 Beth - 希腊文 Dasia | ᠏ܒܓ...´῾????
|
U+200B - U+200D | 零宽间隔 - 零宽连接符 |
|
U+202A - U+202E | 从左至右嵌入 - 从右至左强制 |
|
U+203F - U+2040 | 下连接 - 字符连接 | ‿⁀
|
U+2054 | 竖翻下连接 | ⁔
|
U+2060 - U+218F | 文字连接符 - 倒转数字三 | ...↉↊↋
|
U+2460 - U+24FF | 带圆圈数字一 - 反白带圆圈数字〇 | ①②③...⓽⓾⓿
|
U+2776 - U+2793 | 丁贝符反白带圆圈数字一 - 丁贝符反白带圆圈无衬线数字十 | ❶❷❸...➑➒➓
|
U+2C00 - U+2DFF | 格来哥里大写字母 Azu - 组合用西里尔文字母 lota 化的大 Yus | ⰀⰁⰂ...
|
U+2E80 - U+2FFF | 中日韩字根重复 - 象形字重叠结构 | ⺀⺁⺂...⿹⿺⿻
|
U+3004 - U+3007 | 日本工业标准符号 - 象形字数字 0 | 〄々〆〇
|
U+3021 - U+302F | 杭州数字一 - 朝鲜文双点音调标志 | 〡〢〣...
|
U+3031 - U+D7FF | 竖假名重复标志 - 朝鲜文 PHIEUPH-THIEUTH | ...
|
U+F900 - U+FD3D | 中日韩兼容象形文字-F900 - 带 Fathatan 独立形式的阿拉伯文连字 Alef | 豈更車...ﴻﴼﴽ
|
U+FD40 - U+FDCF | 带 Jeem 的阿拉伯文连字 Te,还带有 Meem 词首形式 - 带 Jeem 的阿拉伯文连字 Noon,还带有 Yeh 词尾形式 |
|
U+FDF0 - U+FE44 | 阿拉伯文连字 Salla 用于可兰经的句号标记独立形式 - 变形显现形式垂直右空心角括号 |
...﹂﹃﹄
|
U+FE47 - U+FFFD | 变形显现形式垂直左方括号 - 替换字符 | ﹇﹈﹉...�
|
U+10000 - U+1FFFD | 线性文字 B 音节 B008 A - 楔形奶酪 (U+1F9C0) | |
U+20000 - U+2FFFD | <中日韩象形文字扩展 B , 第一个> - 中日韩兼容象形文字-2FA1D (U+2FA1D) | |
U+30000 - U+3FFFD | ||
U+40000 - U+4FFFD | ||
U+50000 - U+5FFFD | ||
U+60000 - U+6FFFD | ||
U+70000 - U+7FFFD | ||
U+80000 - U+8FFFD | ||
U+90000 - U+9FFFD | ||
U+A0000 - U+AFFFD | ||
U+B0000 - U+BFFFD | ||
U+C0000 - U+CFFFD | ||
U+D0000 - U+DFFFD | ||
U+E0000 - U+EFFFD | 语言标记 (U+E0001) - 变体选择符-256 (U+E01EF) |
不允许以下列 Unicode 字符的范围为标识符的开头:
代码点 | 说明 | 字符 |
---|---|---|
U+0300 - U+036F | 组合用抑音符 - 组合用拉丁文小写字母 X | |
U+1DC0 - U+1DFF | 组合用带点抑音符 - 组合用下右箭头尖和向下箭头尖 | |
U+20D0 - U+20FF | 组合用上左鱼叉 - 组合用上星号 | |
U+FE20 - U+FE2F | 组合用连字左半 - 组合用西里尔文 Titlo 右半 |