TD [N] всегда объявляет объект типа массива? - PullRequest
0 голосов
/ 12 июня 2018

Я запутался насчет [dcl.array] / 1 :

В объявлении TD, где D имеет вид

D1 [ константа-выражение опт ] атрибут-спецификатор-секв опт

и тип идентификатора в объявлении T D1равно « производный-декларатор-список-типов Т», тогда тип идентификатора D является типом массива;...

Рассмотрим объявление:

int (*p)[42];

Это объявление удовлетворяет грамматике, описанной выше (и не удовлетворяет грамматике, описанной в предыдущих параграфах), поэтому этот параграф должен применятьсяТаким образом, мы заключаем, что тип p является типом массива.Однако мы знаем, что тип p равен pointer to array of 42 int, который является типом указателя.

Я что-то упустил?Или pointer to array of 42 int действительно является типом массива?

Ответы [ 2 ]

0 голосов
/ 16 июля 2018

Это ошибка формулировки стандарта.Конечно, int (*p)[42]; не является типом массива, но удовлетворяет грамматике в [dcl.array] / 1 (и не удовлетворяет предыдущим грамматикам в [dcl.meaning] / 5 , [dcl.meaning] / 6 , [dcl.ptr] / 1 , [dcl.ref] / 1 или [dcl.mptr] / 1 ), поэтому следует применять [dcl.array] / 1.

Я опубликовал редакционную проблему .

0 голосов
/ 12 июня 2018
int (*p)[42];

Вы сказали

Это объявление удовлетворяет грамматике, описанной выше.

Если смотреть таким образом, *p - это массив 42 intэлементы, что является правдой.Это соответствует типу p в самый раз.Это указатель на «массив из 42 int s».

...