Справочное руководство по C++ | страница 45



> список-спецификаций-типа абстрактный-описатель >opt

>список-спецификаций-типа:

> спецификация-типа список-спецификаций-типа

>абстрактный-описатель:

> операция-ptr абстрактный-описатель >opt

> абстрактный-описатель >opt ( список-описаний-параметров ) список-спецификаций cv >opt

> абстрактный-описатель >opt [ выражение-константа >opt ]

> ( абстрактный-описатель )

Можно однозначно указать, в каком месте абстрактного-описателя нужно добавить идентификатор, чтобы конструкция стала описателем, допустимым в описании. Тогда поименованный тип будет тем же, что и тип гипотетического идентификатора. Например, описания

>int // int i

>int * // int *pi

>int *[3] // int *p[3]

>int (*)[3] // int (*p3i)[3]

>int *() // int *f()

>int (*)(double) // int (*pf)(double)

задают соответственно такие типы: "целое", "указатель на целое", "массив из 3 указателей на целое", "указатель на массив из 3 целых", "функция без параметров, возвращающая указатель на целое", "указатель на функцию с параметром типа double, возвращающую целое".

R.8.1.1 Устранение неоднозначности

Неоднозначность, отмеченная в §R.6.8, которая возникает из-за сходства между приведением, заданным в функциональном стиле, и описанием, может также появиться в контексте описания. В этом контексте она проявляется как сходство между описанием функции, в котором есть избыточные скобки вокруг имени параметра, и описанием объекта, в котором в качестве инициализатора используется операция приведения, заданная в функциональном стиле. Как и для операторов, неоднозначность устраняется правилом, согласно которому следует считать описанием любую конструкцию, которая может служить таковым. Можно явно устранить неоднозначность в описании или с помощью приведения, заданного не в функциональном стиле, или с помощью операции = для обозначения инициализации, например,

>struct S {

> S(int);

>};


>void foo(double a)

>{

> S x(int(a)); // описание функции

> S y((int)a); // описание объекта

> S z = int(a); // описание объекта

>}

R.8.2 Смысл описателей

Список описателей следует после (возможно пустого) списка спецификаций-описания (§R.7.1). Каждый описатель содержит в точности одно имя-из-описателя, которое задает описываемый идентификатор. Если не считать описаний некоторых специальных функций (§R.12.3, §R.13.4), имя-из-описателя является просто идентификатором. Спецификации auto, static, extern, register, friend, inline, virtual или typedef относятся непосредственно к каждому имени-из-описателя из списка описателей. Тип каждого имени-из-описателя определяется как спецификацией-описания (§R.7.1), так и его описателем.