Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по С++.doc
Скачиваний:
51
Добавлен:
02.05.2014
Размер:
995.33 Кб
Скачать

R.8 Описатели

Список-описателей, фигурирующий в описании, - это последовательность через запятую описателей, каждый из которых может иметь инициализатор. список-описаний: описатель-с-инициализатором список-описаний , описатель-с-инициализатором описатель-с-инициализатором: описатель инициализатор opt Описание состоит из двух частей: спецификации (спецификация-описания; см. $$R.7.1) и описателей (список-описателей). Спецификации задают основной тип, класс памяти или другие свойства описываемых объектов и функций. Описатели задают имя этих объектов и функций, а также, возможно, изменяют тип с помощью таких операций, как * (указатель на) и () (функция возвращающая). В описателе также можно задать начальные значения, инициализация обсуждается в $$R.8.4 и $$R.12.6. Описатели имеют такой синтаксис: описатель: имя-в-описателе операция-ptr описатель описатель (список-описаний-параметров) список-спецификаций-cv opt описатель [ выражение-константа opt] ( описатель ) операция-ptr: * список-спецификаций-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); // описание объекта }