Читать «Справочное руководство по C++» онлайн - страница 40
Бьярн Страустрап
* список-спецификаций-cv opt
& список-спецификаций-cv opt
полное-имя-класса :: * список-спецификаций-cv opt
список-спецификаций-cv:
const
volatile
имя-в-описателе:
имя
имя-класса
~имя-класса
имя-typedef
уточненное-имя-типа
Конструкция имя-класса имеет определенное назначение при описании класса с этим именем, она же используется как уточнение в операции :: для разрешения коллизий в области видимости (§R.12.1, §R.12.4).
R.8.1 Имена типов
Имя типа необходимо указывать при задании операции явного преобразования типа или в качестве параметра в операциях sizeof или new. Для этого служит конструкция имя-типа, которая синтаксически эквивалентна описанию объекта или функции этого типа, в котором отсутствует имя объекта или функции.
имя-типа:
список-спецификаций-типа абстрактный-описатель 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); // описание объекта