Тип
Объекты, ссылки, функции включая специализированные функции шаблона и выражения, имеют Свойство, называемое «тип», которое ограничивает операции, которые разрешены для этих объектов, и предоставляет семантический смысл в противном случае общие последовательности бит.
Содержание |
[править] Типовая классификация
Система типа C ++ состоит из следующих типов:
- тип void (см. также std::is_void);
- тип std::nullptr_t Шаблон:mark начиная с c++11 (см. std::is_null_pointer);
- арифметические типы (см. также std::is_arithmetic):
- типы с плавающей запятой (float, double, long double) (см. std::is_floating_point);
- интегральные типы (см. также std::is_integral):
- тип bool;
- символьные типы:
- короткие символьные типы (char, signed char, unsigned char);
- широкие символьные типы (char16_t, char32_t, wchar_t);
- знаковые целые типы (short int, int, long int, long long int);
- беззнаковые целые типы (unsigned short int, unsigned int, unsigned long int, unsigned long long int);
- Составные типы (см. std::is_compound):
- ссылочные типы (см. std::is_reference):
-
- lvalue-ссылка (левосторонняя ссылка) на объекты;
- lvalue-ссылка на функции;
- rvalue-ссылка (правосторонняя ссылка) на объекты;
- rvalue-ссылка на функции;
- указательные ссылки (см. std::is_pointer):
- указатели на члены функций (см.std::is_member_pointer):
- массивы (см. std::is_array);
- функциональные типы (см. std::is_function);
- перечеслители (см. std::is_enum);
- Классы:
- Не-union типы (см. std::is_class);
- union типы (см. std::is_union).
Для каждого типа, кроме ссылки и функции, система типов поддерживает три дополнительные cv-qualified versions этого типа (const, volatile и const volatile).
Типы группируются в разных категориях в зависимости от их свойств:
- Тип объекта - это (возможно, cv-квалифицированный) тип, который не является типом функции, а не ссылочным типом, а не void (см. Также std::is_object);
- Скалярные типы (возможно, cv-qualit), арифметические, указательные, указатели на типы членов, перечисления и std :: nullptr_t (см. Также std::is_scalar);
- Тривиальные типы (см. Также std::is_trivial), типы POD (см. Также std::is_pod), литералы (см. Также std::is_literal_type ) И другие категории, перечисленные в Библиотека свойств типов или как named type requirements.
[править] Именование типов
Имя можно объявить ссылкой на тип с помощью:
- class;
- enum;
- typedef;
- type_alias.
Типы, которые не имеют имен, часто должны упоминаться в программах на C ++; Синтаксис для этого известен как «тип-идентификатор». Синтаксис идентификатора типа, который называет тип T, является в точности синтаксисом declaration переменной или функции типа T с пропущенным идентификатором, за исключением того, что decl-specifier-seq ' 'Грамматики объявления ограничено' 'type-specifier-seq' ', и что новые типы могут быть определены только в том случае, если идентификатор типа появляется в правой части объявления псевдонима без шаблона.
Int * p; // объявление указателя на int static_cast <Int *> (р); // type-id - "int *" Int a [3]; // объявление массива из 3 int New int [3]; // type-id - это «int [3]» (называемый new-type-id) Int (* (* x [2]) ()) [3]; // объявление массива из 2 указателей на функции // возвращающий указатель на массив из 3 int New (int (* (* [2]) ()) [3]); // type-id is "int (* (* [2]) ()) [3]" Void f (int); // объявление функции, принимающей int и возвращающее пустоту Std :: function <void (int)> x = f; // Тип параметра шаблона - это идентификатор типа "void (int)" Std :: vector <int> v; // объявление вектора int SizeOf (станд :: вектор <Int>); // type-id - "std :: vector <int>" Struct {int x; } B; // создает новый тип и объявляет объект b этого типа Sizeof (struct {int x;}); // ошибка: невозможно определить новые типы в выражении sizeof Используя t = struct {int x; }; // создает новый тип и объявляет t как псевдоним этого типа Sizeof (статический int); // ошибка: спецификаторы класса хранения не входят в тип-specifier-seq Std :: function <inline void (int)> f; // ошибка: ни спецификаторы функций
Часть декларации «декларатор» в грамматике декларации с удаленным именем называется «абстрактным-декларатором».
«Идентификатор типа» может использоваться в следующих ситуациях:
- Указать целевой тип в литые выражения;
- В качестве аргументов sizeof, alignof, alignas, new и typeid;
- В правой части объявления type alias;
- Как возвращающий возвращаемый тип объявления function;
- В качестве аргумента по умолчанию параметров параметр типа шаблона;
- В качестве аргумента шаблона для параметров параметр типа шаблона;
- В динамической спецификации исключения.
Тип-id может использоваться с некоторыми изменениями в следующих ситуациях:
- В списке параметров функции function (когда имя параметра опущено), type-id использует decl-specifier-seq вместо type-specifier-seq (В частности, некоторые спецификаторы класса хранения разрешены);
- В имени определяемая пользователем функция преобразования, абстрактный декларатор не может включать операторы функций или массивов.
| Этот раздел не завершён Причина: 8.2[dcl.ambig.res] |
| Этот раздел не завершён Причина: decltype и auto |
[править] Подробный спецификатор типов
Специфицированные спецификаторы типов могут использоваться для ссылки на ранее объявленное имя класса (класс, структура или объединение) или на ранее объявленное имя перечисления, даже если имя было lookup
Для выражений prvalue динамический тип всегда совпадает с типом статического типа.
[править] Неполный тип
Следующие типы являются «неполными типами»:
- Тип void (возможно cv - квалифицированный);
- Тип класса, который был объявлен (например, forward declaration), но не определен;
- массив неизвестных границ;
- Массив элементов неполного типа;
- тип перечисления с момента объявления до определения его базового типа.
Любой из следующих контекстов требует, чтобы класс T был полным:
- definition или вызов функции функции с возвращаемым типом
Tили тип аргументаT<! - есть исключения, например, когда вызов функции Является операндом decltype ->; - definition объекта типа
T; - Объявление члена нестатического элемента данных класса типа
T; - new-expression для объекта типа
Tили массива, тип элемента которогоT; - lvalue-to-rvalue conversion применяется к glvalue типа
T; - Преобразование неявного или явного к типу
T; - стандартное преобразование, dynamic_cast или static_cast для ввода
T *илиT &, за исключением При преобразовании из константы нулевого указателя или из указателя указатель на void; - оператор доступа к члену класса применяется к выражению типа
T;
Оператор typeid, sizeof или alignof применяется к типу T;
- арифметический оператор применяется к указателю на
T; - Определение класса с базовым классом
T; - Присвоение l значению типа
T; - A catch-clause для исключения типа
T,T &илиT *.
(В общем, когда размер и расположение T должны быть известны.)
Если какая-либо из этих ситуаций возникает в блоке трансляции, определение типа должно отображаться в одной и той же единице перевода. В противном случае это не требуется.
| Этот раздел не завершён Причина: rules for completing the incomplete types from §3.9[basic.types]/6 |
[править] See also
| Справка по C — Типы
|

