T D[N]总是声明一个数组类型的对象吗?

6
我对[dcl.array]/1感到困惑:

在声明 T D 中,D 的形式为

          D1 [ 常量表达式可选 ] 属性说明符序列可选

并且声明 T D1 中标识符的类型为“派生声明符类型列表 T”,则 D 的标识符类型是数组类型;...

考虑以下声明:
int (*p)[42];

这个声明符合上述语法(不符合前面段落中描述的语法),因此应该适用于本段,因此我们得出 p 的类型是数组类型。但是,我们知道 p 的类型是 指向包含 42 个 int 元素的数组的指针,这是指针类型。
我有什么遗漏吗?或者说,指向包含 42 个 int 元素的数组的指针 确实是一个数组类型吗?

1
"D1" 是 "(*p)",所以 "*p" 的类型是一个数组类型,因此 "p" 的类型是数组类型的指针。 - Barmar
2
@Barmar 规范中说“D的标识符类型是数组类型”,我认为“D的标识符”指的是p - xskxzr
1
@Barmar 如果它只关心 D1 是标识符的情况,它会简单地使用 T 替代“derived-declarator-type-list T”。 - xskxzr
3
这措辞似乎不太对。 - Barry
我认为这可以被视为一项编辑问题 - cpplearner
显示剩余5条评论
2个回答

2

你能解释一下为什么用 declarator-id 替换 identifier 解决了这个问题吗? - Alexander

-1
int (*p)[42];

你说过

这个声明符合上述的语法。

从这个角度来看,*p 是一个由 42 个 int 元素组成的数组,这是正确的。它完美地符合了 p 的类型。它是指向“一个由 42 个 int 组成的数组”的指针。


1
那么D的标识符类型是数组类型。它提到了“标识符”。还有一个相关且类似的句子,它们似乎相互矛盾。 - xskxzr
当以这种方式看待时,语法不匹配。(*p)不是一个标识符。 - R Sahu
3
不要求 D1 是一个标识符。 - xskxzr
@xskxzr,也许这个答案会有所帮助。 - R Sahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接