C++ 对完整类型概念的形式化理解
我正试图从形式上理解这个概念。第13/1节规定: 同一范围内的两个声明,声明了相同的名称,但具有 不同类型的称为重载声明仅功能和 函数模板声明可以重载;变量和类型 不能重载声明 这在形式上意味着,例如,程序包含以下内容:C++ 对完整类型概念的形式化理解,c++,arrays,C++,Arrays,我正试图从形式上理解这个概念。第13/1节规定: 同一范围内的两个声明,声明了相同的名称,但具有 不同类型的称为重载声明仅功能和 函数模板声明可以重载;变量和类型 不能重载声明 这在形式上意味着,例如,程序包含以下内容: extern int a[5]; int a[6]; 由于类型不同,int[5]和int[6]的格式不正确 现在考虑声明 extern int a[]; int a[6]; 标准规定3.9/6: 数组对象的声明类型可能是大小未知的数组 因此,在翻译单元的某一点上是不完整的
extern int a[5];
int a[6];
由于类型不同,int[5]
和int[6]
的格式不正确
现在考虑声明
extern int a[];
int a[6];
标准规定3.9/6:
数组对象的声明类型可能是大小未知的数组
因此,在翻译单元的某一点上是不完整的
以后完成这两点的数组类型(“数组
“T的未知界”和“N的数组”是不同的类型
但是,正如@mattmcnab在前面的声明中所说,这些声明声明声明了相同类型的变量。这是自然的和合乎逻辑的,但标准在其中的含义并不清楚 如您所述,不允许出现以下情况:
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];
如果我想变得幽默,我会写‘只需使用一个整数向量’,如果这句话被标注为语言完美,会不会有帮助呢!正是我想要的。谢谢所以这个例外只是3.9/6的规则,是吗?这就是我所说的,是的。