正式理解完整类型的概念

时间:2014-09-24 05:17:01

标签: c++ arrays

我正试图正式理解这个概念。第13/1节说:

  

同一范围内的两个声明,声明相同的名称,但有   不同类型称为重载声明。 仅功能和   功能模板声明可以重载;变量和类型   声明不能超载。

这正式意味着,例如程序包含以下内容:

extern int a[5];
int a[6];
由于类型int[5]int[6]不同,

格式不正确。

现在考虑声明

extern int a[];
int a[6];

标准说3.9 / 6:

  

数组对象的声明类型可能是未知大小的数组   因此,在翻译单位的某一点上不完整   稍后完成; 这两个点的数组类型(“数组的数组   未知的T“和”N T“数组的界限是不同的类型

但是,正如@MattMcNabb先前在comment中所述,这些声明声明了相同类型的变量。这是自然而合乎逻辑的,但标准中的含义并不明确。

1 个答案:

答案 0 :(得分:0)

正如您所指出的,不允许以下内容:

extern int a[5];
int a[6];
无论如何,

都有一个问题
extern int a[];
int a[6];

§3.5/ 10

  

在对类型进行所有调整(其中typedefs(7.1.3)被其定义替换之后),类型   由引用给定变量或函数的所有声明指定的应该是相同的,除了声明之外   对于数组对象,可以指定由主数组的存在与否而不同的数组类型   约束(8.3.4)。违反此规则的类型标识不需要诊断。

这实际上是规则的例外。如果类型不同,这将不起作用

extern int arr[];
float arr[6];