关于C++标准conv.qual#1限定分解规则与示例的疑问
C++限定分解的疑问解答
C++标准conv.qual#1内容:类型T的限定分解是一组cvi和Pi序列,使得T可表示为“cv0 P0 cv1 P1 ⋯ cv_n-1 Pn-1 cvn U”(n≥0),其中cvi是cv限定符集合,Pi为“指向”。示例指出
const int**有三种限定分解,U可分别为int、指向const int的指针、指向指向const int的指针。
1. const int**如何对应标准中的分解形式(U为int)?
要匹配标准结构,需从指针层级由外到内对应序列:
- 取n=2(对应两个“指向”操作),结构为
cv0 P0 cv1 P1 cv2 Ucv0:空(最外层指针无cv限定)P0:指向cv1:空(中间层指针无cv限定)P1:指向cv2:constU:int
把这些元素组合起来就是:[空]指向[空]指向const int,也就是我们看到的const int**,完全符合标准表述。
2. 为什么U要放在序列末尾?
这是因为C++类型声明遵循从内到外的解读逻辑:U是最底层的非指针基础类型(如int、自定义类),所有指针层级(Pi)和对应的cv限定(cvi)都是逐层包裹在U之外的。将U放在末尾,正好对应“先确定最内层基础类型,再向外逐层添加指针与限定”的分解逻辑,和编译器解析类型的顺序完全一致。
3. 类似const * volatile * const*的写法如何构成合法类型?
这类写法是把cv限定符放在了指针符号*的左侧,本质是省略了最内层的基础类型U。C++允许在*左右放置cv限定符:
- 放在
*左侧时,修饰的是指针指向的类型(比如const int*和int const*等价,都是指向const int的指针) - 放在
*右侧时,修饰的是指针本身(比如int* const表示指针本身是const的,不可修改)
要让const * volatile * const*成为合法类型,只需补全最内层的基础类型U,放在序列末尾即可。比如完整写法可以是const int* volatile* const*,拆解后:
- 最外层:
const*→ 指针本身是const的,指向一个volatile指针 - 中间层:
volatile*→ 指针本身是volatile的,指向const int - 最内层:
const int→ U为int,带有const限定
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

