声明是下列之一:
attr(可选) 声明符 ; | ||
attr (C++11 起) | - | 任意数量的序列 |
声明符 | - | 函数声明符。 |
- 块声明(能出现于中的声明),它可以是下列之一:
- 汇编声明
- (C++11 起)
- 命名空间别名定义
- static_assert 声明 (C++11 起)
- (C++11 起)
- 简单声明
简单声明是引入、创建并可选地初始化一个或数个标识符(典型地为变量)的语句。
声明说明符序列 初始化声明符列表(可选) ; | (1) | |
attr 声明说明符序列 初始化声明符列表; | (2) | |
attr (C++11 起) | - | 任何数量属性的序列 |
声明说明符序列(decl-specifier-seq) | - | 说明符(specifier)的序列(见下文)。 |
初始化声明符列表(init-declarator-list) | - | 带可选的初始化器(initializer)的声明符(declarator)的逗号分隔列表。 初始化声明符列表 在声明具名的 class/struct/union 或具名枚举时是可选的 |
亦为简单声明。 (C++17 起)
声明说明符(声明说明符序列)是下列以空白分隔的说明符的序列,顺序任意:
friend
说明符允许在类和函数声明中使用。
- 说明符,只允许在变量定义,函数及函数模板声明,以及具有字面类型的静态数据成员的声明中使用。 | (C++11 起) |
- consteval 说明符,只允许在函数和函数模板声明中使用。- 说明符,只允许在拥有静态或线程存储期的变量声明中使用。一个 声明说明符序列 中至多允许出现 constexpr 、 consteval 和 constinit 说明符中的一者。 | (C++20 起) |
- 存储类说明符(、static、 (C++11 起)、extern、)。仅允许使用一个存储类说明符,但
thread_local
可以与extern
或static
一同出现。 - 类型说明符(类型说明符序列),指名一个类型的说明符的序列。声明所引入的每个实体均为此类型,可选地为声明符所修饰(见下文)。这个说明符序列也被类型标识(type-id)所用。唯有下列说明符是 类型说明符序列 的一部分,顺序任意:
- - - - decltype 说明符 | (C++11 起) |
- 先前声明过的类名(可选地)
- 先前声明过的枚举名(可选地有限定)
- 带模板实参的模板名(可选地,可选地用 template 消歧义符)
- - - 无模板实参的模板名(可选地):参阅类模板实参推导 | (C++17 起) |
- 每个 声明说明符序列 中只允许一个类型说明符,但有以下例外:
const
能与自身外的任何类型说明符组合。
volatile
能与自身外的任何类型说明符组合。
signed
或unsigned
能与char
、long
、short
或int
组合。
short
或long
能与int
组合。
可出现于 声明说明符序列 中,该情况下它们应用于其之前的说明符所确定的类型。
声明说明符序列 中仅有的允许两次出现的说明符是 long (可出现两次)。所有其他重复,例如 const static const 或 均为错误。 | (C++17 起) |
初始化声明符列表(init-declarator-list)是一或多个 初始化声明符(init-declarator) 的逗号分隔列表,它拥有下列语法:
声明符 初始化器(可选) | (1) | |
声明符 requires-子句 | (2) | (C++20 起) |
声明符(declarator) | - | 声明符 |
初始化器(initializer) | - | 可选的初始化器(除非在必要的场合,例如初始化引用或 const 对象时)。细节见初始化。 |
requires-子句(C++20) | - | ,向函数声明添加 |
初始化声明符序列 S D1, D2, D3; 中的每个 初始化声明符,均按照如同它是拥有相同说明符的孤立声明来处理:S D1; S D2; S D3;。
声明符 是下列之一:
无限定标识 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) | |
1) 所声明的名称。
2) 使用(有限定标识)定义或重声明先前声明的命名空间成员或的声明符。
3) 形参包,仅出现于中。
4) 指针声明符:声明 S * D; 将 D
声明为指向 声明说明符序列 所确定的类型 S
的指针。
5) :声明 S C::* D; 将 D
声明为指向 C
中的类型为 声明说明符序列 所确定的类型 S
的成员的指针。嵌套名说明符 为名字和作用域解析运算符 ::
的序列
6) :声明 S & D; 将 D
声明为到 声明说明符序列 所确定的类型 S
的左值引用。
8) 数组声明符。noptr-声明符 为任何合法声明符,但若它以 *、& 或 && 起始,则必须用括号环绕它。
9) 。noptr-声明符 为任何合法声明符,但若它以 *、& 或 && 起始,则必须用括号环绕它。注意最外层函数声明符可以可选的尾随返回类型结尾。
所有情况下,attr 均为可选的属性的序列。当其紧跟标识符之后出现时,它应用于所声明的对象。
cv 是 限定符的序列,其中任一限定符在序列中至多出现一次。
块声明出现在代码块内,而当声明中引入的标识符之前已在某个外层代码块中声明时,该代码块的剩余部分中。
若声明引入具有自动存储期的变量,则它在执行其声明语句时初始化。退出代码块时,所有声明于该块中的自动变量被以其初始化顺序的相反顺序销毁(无关乎如何退出代码块:通过异常、 或抵达其结尾)。
运行此代码