问题描述
我们可以的 decalre 的一个不完整的对象类型的变量,但不能定义一个不完全类型的对象。
3.9 / 4说:
We can decalre a variable of an incomplete object type, but cannot define an object of an incomplete type.As 3.9/4 says:
这已宣告但尚未定义的类,在枚举类型
某些情况下(7.2),或未知大小或不完整的阵列的
的元素类型的,是不完全定义的对象类型。
完全确定对象类型和无效类型是不完整
类型(3.9.1)。 物件不应被定义为具有一个不完整的的
的类型。的
所以下面的例子
int a[];//error: storage size of 'a' isn't known
int main()
{
}
是病态的。
DEMO
但是,当我们初始化变量如下:
But, when we initialize that variable as follows:
int a[] = {1,2}; //OK
int main()
{
}
DEMO
我不明白为什么在后者的例子 int类型的[] = {1,2};
不会引发像的编译时错误一个不完全类型的对象的定义的。你能使用标准解释呢?
I don't understand why in the latter example int a[] = {1,2};
doesn't throw a compile-time error like Definition of an object of an incomplete type. Could you explain it using the Standard?
推荐答案
从N3936报价§8.3.4/ 1
Quoting from N3936 §8.3.4/1
...除以下,如果省略恒定前pression,的类型
D
的标识符为导出声明符类型列表的约束 T的未知的阵列
,一个不完整的对象类型。 ...
除了如下面指出的是指§8.3.4/ 3
"Except as noted below" refers to §8.3.4/3
...也可在说明符后跟一个省略结合的阵列
初始化(8.5)。在这种情况下,边界被从最初的元素(比如 N
)提供的数计算
(8.5.1)和 D的标识符的类型
是的 N个阵列
T
。......
因此,在
int a[] = {1, 2};
声明的类型 A
其实就是 INT [2]
,而不是为int []
。
这篇关于它是与未知大小的数组的定义吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!