Пространства имён
Варианты
Действия

Тип

Материал из cppreference.com
< cpp‎ | language

Объекты, ссылки, функции включая специализированные функции шаблона и выражения, имеют Свойство, называемое «тип», которое ограничивает операции, которые разрешены для этих объектов, и предоставляет семантический смысл в противном случае общие последовательности бит.


Содержание

[править] Типовая классификация

Система типа C ++ состоит из следующих типов:

  • тип 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);
  • lvalue-ссылка (левосторонняя ссылка) на объекты;
  • lvalue-ссылка на функции;
  • rvalue-ссылка (правосторонняя ссылка) на объекты;
  • rvalue-ссылка на функции;

Для каждого типа, кроме ссылки и функции, система типов поддерживает три дополнительные 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.

[править] Именование типов

Имя можно объявить ссылкой на тип с помощью:

Типы, которые не имеют имен, часто должны упоминаться в программах на 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; // ошибка: ни спецификаторы функций

Часть декларации «декларатор» в грамматике декларации с удаленным именем называется «абстрактным-декларатором».

«Идентификатор типа» может использоваться в следующих ситуациях:

Тип-id может использоваться с некоторыми изменениями в следующих ситуациях:

  • В списке параметров функции function (когда имя параметра опущено), type-id использует decl-specifier-seq вместо type-specifier-seq (В частности, некоторые спецификаторы класса хранения разрешены);
  • В имени определяемая пользователем функция преобразования, абстрактный декларатор не может включать операторы функций или массивов.


[править] Подробный спецификатор типов

Специфицированные спецификаторы типов могут использоваться для ссылки на ранее объявленное имя класса (класс, структура или объединение) или на ранее объявленное имя перечисления, даже если имя было lookup

Для выражений prvalue динамический тип всегда совпадает с типом статического типа.

[править] Неполный тип

Следующие типы являются «неполными типами»:

Любой из следующих контекстов требует, чтобы класс T был полным:

Оператор typeid, sizeof или alignof применяется к типу T;

  • арифметический оператор применяется к указателю на T;
  • Определение класса с базовым классом T;
  • Присвоение l значению типа T;
  • A catch-clause для исключения типа T, T & или T *.

(В общем, когда размер и расположение T должны быть известны.)

Если какая-либо из этих ситуаций возникает в блоке трансляции, определение типа должно отображаться в одной и той же единице перевода. В противном случае это не требуется.

[править] See also