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

时间:2018-06-12 18:30:07

标签: c++ arrays language-lawyer declaration

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

  

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

     

D1 [常量表达式 opt ] attribute-specifier-seq opt

     

并且声明T D1中的标识符的类型是“ derived-declarator-type-list T”,则D的标识符的类型是数组类型; ...

考虑声明:

int (*p)[42];

该声明满足上述语法(并且不满足前面段落中描述的语法),因此本段应该适用,因此我们得出结论p的类型是数组类型。但是,我们知道p的类型是pointer to array of 42 int,它是指针类型。

我错过了什么吗?或者pointer to array of 42 int确实是数组类型?

2 个答案:

答案 0 :(得分:2)

这是标准措辞的错误。当然,int (*p)[42];不是数组类型,但是满足[dcl.array]/1中的语法(并且不满足[dcl.meaning]/5[dcl.meaning]/6[dcl.ptr]/1中的先前语法,[dcl.ref]/1[dcl.mptr]/1),因此应使用[dcl.array] / 1。

我发布了一个editorial issue

答案 1 :(得分:-1)

*p

你说

  

该声明符合上述语法。

当看到这种方式时,int是一个包含42个p元素的数组,这是正确的。这恰好符合int的类型。它是指向" 42 {{1}} s"。

的数组的指针