6 Basic concepts [basic]

6.9 Types [basic.types]

6.9.2 Compound types [basic.compound]

Составные типы могут быть созданы следующими способами:

  • arrays объектов данного типа [dcl.array],;

  • functions, которые имеют параметры заданных типов и возвращают, void или ссылки, или объекты заданного типа [dcl.fct],;

  • pointers в cv void или объекты или функции (включая статические члены классов) данного типа [dcl.ptr];

  • references к объектам или функциям данного типа [dcl.ref]. Есть два типа ссылок:

  • classes содержащий последовательность объектов различных типов (Clause [class]), набор типов, перечислений и функций для управления этими объектами ([class.mfct]) и набор ограничений на доступ к этим объектам (Clause [class.access]);

  • unions, Которые являются классы , способные содержать объекты разных типов в разные моменты времени, [class.union];

  • enumerations, которые содержат набор именованных постоянных значений. Каждое отдельное перечисление представляет собой различное enumerated type, [dcl.enum];

  • pointers to non-static class members,53 Которые идентифицируют пользователей данного типа в пределах объектов данного класса, [dcl.mptr].

Эти методы построения типов можно применять рекурсивно; ограничения указаны в [dcl.ptr], [dcl.array], [dcl.fct], и [dcl.ref]. Создание типа, в котором количество байтов в его объектном представлении превышает максимальное значение, представленное в type std​::​size_­t ([support.types]), является плохо сформированным.

Тип указателя cv void или указателя на тип объекта называется object pointer type. [ Note: Указатель на void не имеет типа указатель на объект, потому что void не является типом объекта. ] Тип указателя, который может обозначать функцию, называется a . Указатель на объекты типа называется «указателем на ». [ Указатель на объект типа называется «указателем на », а указатель на объект класса называется «указателем на ». ] За исключением указателей на статические члены, текст, относящийся к «указателям», не применяется к указателям на члены. Указатели на неполные типы разрешены, хотя есть ограничения на то, что с ними можно делать ( ). Каждое значение типа указателя является одним из следующих: end note function pointer type T TExample: int int X X end example[basic.align]

Значение типа указателя, которое является указателем на конец или после конца объекта represents the address первого байта в памяти ([intro.memory]), занятого объектом,54 или первого байта в памяти после конца памяти, занятой объектом, соответственно. [ Note: Указатель за концом объекта ([expr.add]) не считается указывающим на несвязанный объект типа объекта, который может быть расположен по этому адресу. Значение указателя становится недействительным, когда память, которую он обозначает, достигает конца срока хранения; см [basic.stc]. ] Для целей и сравнения ( , ), указатель за конец последнего элемента массива из элементов считаются эквивалентным указателем на гипотетический элемент . Представление значений типов указателей определяется реализацией. Указатели на типы, совместимые с макетом, должны иметь одинаковое представление значения и . [ Указатели не должны иметь специального представления, но их диапазон допустимых значений ограничен расширенным требованием выравнивания. ]end note pointer arithmetic[expr.rel] [expr.eq] x n x[n] alignment requirementsNote: over-aligned types end note

Два объекта a и b являются, pointer-interconvertible если:

  • это один и тот же объект, или

  • один - объект объединения стандартного макета, а другой - нестатический член данных этого объекта ([class.union]), или

  • один является объектом класса стандартного макета, а другой - первым нестатическим членом данных этого объекта, или, если объект не имеет нестатических членов данных, первым подобъектом базового класса этого объекта ([class.mem]) или

  • существует такой объект c , что a и c являются взаимопреобразуемыми по указателям, и c и b являются взаимопреобразуемыми по указателям.

Если два объекта взаимопреобразуемы по указателю, то они имеют одинаковый адрес, и можно получить указатель на один из указателя на другой через a reinterpret_­cast. [ Note: Объект массива и его первый элемент не являются взаимопреобразуемыми по указателям, даже если они имеют одинаковый адрес. ]end note

Указатель на cv-qualified или cv-unqualified void может использоваться для указания на объекты неизвестного типа. Такой указатель должен содержать любой указатель на объект. Объект типа cv void* должен иметь те же требования к представлению и выравниванию, что и cv char*.

Статические члены класса - это объекты или функции, а указатели на них - обычные указатели на объекты или функции.

Для объекта, срок жизни которого не истек, это первый байт в памяти, который он будет занимать или использовать.