【发布时间】:2014-09-22 05:11:37
【问题描述】:
3.9/6 N3797:
[...]
指向未知大小数组的指针的类型,或已定义的类型 通过 typedef 声明为未知大小的数组,不能 完成。
听起来指向未知大小数组的指针是不完整的类型。如果是这样,我们就不能定义一个指向未知大小数组的指针对象。但这不是真的,因为我们可以定义一个未知边界的数组。
#include <iostream>
using std::cout;
using std::endl;
int (*a)[] = (int(*)[])0x4243afff;
int main()
{
}
它编译得很好。
如果它是不完整的类型,我们就无法做到这一点。确实: 3.9/5:
对象不应被定义为具有不完整的类型
标准之前定义的不完整类型如下3./5:
已声明但未定义的类,枚举类型 某些上下文(7.2),或未知大小或不完整的数组 元素类型,是一个未完全定义的对象类型。 未完全定义的对象类型和 void 类型不完整 类型 (3.9.1)。
这意味着指向不完整类型的指针是完整的。矛盾?
那么我的推理哪里错了?
【问题讨论】:
-
为什么你认为你不能有一个指向不完整类型的指针?
-
曾经写过像“typedef struct list { void *value; struct list *nxt; } list”这样的链表结构吗?
-
那不是数组。这只是一个内存地址。
-
“指向”不完整类型的指针类型本身就是完整类型。但是,我们不能将
int (*a)[]的类型更改为int (*)[5]。我认为,这就是标准想要用“无法完成”来表达的意思。 -
如果你想引用标准,至少要把你的章节号弄对。