Чтобы задать преобразования типов в явном виде, и в качестве аргумента sizeof, alignof, newили typeid, должно быть указано имя типа. Это можно сделать с помощью a type-id, который синтаксически является объявлением переменной или функции этого типа, в которой отсутствует имя объекта.
type-id: type-specifier-seq abstract-declaratoropt
defining-type-id: defining-type-specifier-seq abstract-declaratoropt
abstract-declarator: ptr-abstract-declarator noptr-abstract-declaratoropt parameters-and-qualifiers trailing-return-type abstract-pack-declarator
ptr-abstract-declarator: noptr-abstract-declarator ptr-operator ptr-abstract-declaratoropt
noptr-abstract-declarator: noptr-abstract-declaratoropt parameters-and-qualifiers noptr-abstract-declaratoropt [ constant-expressionopt ] attribute-specifier-seqopt ( ptr-abstract-declarator )
abstract-pack-declarator: noptr-abstract-pack-declarator ptr-operator abstract-pack-declarator
noptr-abstract-pack-declarator: noptr-abstract-pack-declarator parameters-and-qualifiers noptr-abstract-pack-declarator [ constant-expressionopt ] attribute-specifier-seqopt ...
Можно однозначно идентифицировать местоположение в том месте, abstract-declarator где появится идентификатор, если бы конструкция была декларатором в объявлении. В этом случае именованный тип совпадает с типом гипотетического идентификатора. [ Example:
int // int i int * // int *pi int *[3] // int *p[3] int (*)[3] // int (*p3i)[3] int *() // int *f() int (*)(double) // int (*pf)(double)
назовите соответственно типы «int», «указатель на int», «массив из 3 указателей на int», «указатель на массив из 3 int», «функция (без параметров), возвращающая указатель на int» и «указатель на функцию (double), возвращающую int». ] — end example