C++ 类型阅读入门

C++ 的类型可读性很差,并且大多数入门材料中并没有详细介绍如何阅读它们,最多只是讲到 top-level const 和 low-level const 的区别。有不少朋友问过我这方面的问题,讲得多了,干脆整理起来写篇文章。 常见误解 在详细讲类型的阅读之前,需要纠正一个常见的误解。 问:int a[5] 里的 a 是什么类型的? 答:int[5] 类型,在适当的时候会「退化」(decay)成为 int* 类型。 问:int a[5][6] 里的 a 是什么类型的? 答:int[5][6] 类型,在适当的时候会「退化」成为 int(*)[6] 类型,即指向 int[6] 的指针。 由于「退化」这种隐式转换的存在,很多初学 C++ 的人会把数组类型等同于指针类型。 类似的,函数类型也会「退化」到指针类型,如 int(int, int) 会「退化」成为 int(*)(int, int)。 解方程 当你查阅如何阅读一些复杂的类型时,你可能会看到网络上一些人说 C++ 的类型就是解方程,让我来详细解释一下这句话。 抛去 CVR (const, volatile, reference) 等不谈,C++ 最基本的声明分为两个部分:写在最左边的类型名是「类型说明符」(type specifier),剩下的部分是「声明符」(declarator)。这部分内容是从 C 继承过来的,它们是 C++ 类型里最恶心的地方。但这两个名字实在没啥识别度,我喜欢不严谨地称呼为返回值类型和调用表达式,这点后面会解释。先来看几个例子吧: 声明 类型说明符 声明符 int a int a int* a int *a int a[5] int a[5] int* a[5] int *a[5] int (*a)[5] int (*a)[5] 作出这种分别后,就可以理解上表中a的类型是怎样决定的了:以「声明符」的形式调用a后,得到的返回值类型为「类型说明符」。所谓的解方程就是这样一个过程:...

2021-02-13 · QuarticCat