类型的限定分解是cvi和Pi
T
的序列,使得T
“cv0 P0 cv1 P1 … cv_n-1 Pn-1 cvn U” 对于n ≥ 0,
其中每个cvi是一组 cv 限定符 ([basic.type.qualifier]),每个Pi是“指向”的指针 ([dcl.ptr]),[...]
【例1:type-id表示的类型
const int **
具有三种限定分解,将U视为“int
”、“指向const的指针int
”、“指向指向的指针的指针const int
”。—结束示例]
我不明白““ cv0 P0 cv1 P1 ⋯ cv_n-1 Pn-1 cvn U” for n ≥ 0”的描述如何与该示例兼容。
我的意思是,这个例子是T == const int**
,并且据说存在 U 的可能分解int
。这怎么可能呢?const int**
( )如何T
写成cv0 P0 cv1 P1 ⋯ cv_n-1 Pn-1 cvn int
?
但更一般地说,我不明白为什么 U 位于cv0 P0 cv1 P1 ⋯ cv_n-1 Pn-1 cvn U_的末尾而不是开头。比如说,任何东西怎么可能const * volatile * const*
是一种类型呢?
cv_0 P_0 cv_1 P_1 ⋯ cv_n-1 P_n-1 cv_n U
并不意味着表示type-id的语法形式,例如const int**
.U
它旨在表示替换、P
s 和cv
s后类型的正式全文名称。正如注释所说,由 type-id 形成的类型
const int**
在形式上是“指向指针的指针const
int
”(并且int const**
将形成相同的类型)。cv_0 P_0 cv_1 P_1 ⋯ cv_n-1 P_n-1 cv_n U
您可以通过选择n = 2
并替换U
为int
、cv_2
、“ pointer to”、“pointer to” 以及剩余的 cv 来获得此正式名称const
。P_1
P_0