Составные типы могут быть созданы следующими способами:
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 T Example: int int X X — end example [basic.align]
a pointer to объект или функция (говорят, что указатель point на объект или функцию), или
pointer past the end of объект ([expr.add]), или
null pointer value ([conv.ptr]) для этого типа, или
Значение типа указателя, которое является указателем на конец или после конца объекта represents the address первого байта в памяти ([intro.memory]), занятого объектом,54 или первого байта в памяти после конца памяти, занятой объектом, соответственно. [ Note: Указатель за концом объекта ([expr.add]) не считается указывающим на несвязанный объект типа объекта, который может быть расположен по этому адресу. Значение указателя становится недействительным, когда память, которую он обозначает, достигает конца срока хранения; см [basic.stc]. ] Для целей и сравнения ( , ), указатель за конец последнего элемента массива из элементов считаются эквивалентным указателем на гипотетический элемент . Представление значений типов указателей определяется реализацией. Указатели на типы, совместимые с макетом, должны иметь одинаковое представление значения и . [ Указатели не должны иметь специального представления, но их диапазон допустимых значений ограничен расширенным требованием выравнивания. ] — end note pointer arithmetic[expr.rel] [expr.eq] x n x[n] alignment requirements Note: 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*.
Статические члены класса - это объекты или функции, а указатели на них - обычные указатели на объекты или функции.
Для объекта, срок жизни которого не истек, это первый байт в памяти, который он будет занимать или использовать.