6 Basic concepts [basic]

6.9 Types [basic.types]

6.9.3 CV-qualifiers [basic.type.qualifier]

Тип, упомянутый в [basic.fundamental] и [basic.compound] - это cv-unqualified type. Каждый тип, который является cv-неквалифицированным полным или неполным типом объекта или is void ([basic.types]), имеет три соответствующих cv-квалифицированных версии своего типа: const-qualified версия, volatile-qualified версия и const-volatile-qualified версия. Тип объекта ([intro.object]) включает в себя cv-qualifiers указано в decl-specifier-seq, declarator, type-id, или new-type-idпри создании объекта.

  • A const object - объект типа const T или неизменяемый подобъект такого объекта.

  • A volatile object - это объект типа volatile T, подобъект такого объекта или изменяемый подобъект константного изменчивого объекта.

  • A const volatile object - это объект типа const volatile T, неизменяемый подобъект такого объекта, константный подобъект изменчивого объекта или неизменяемый изменчивый подобъект константного объекта.

Варианты типа cv-qualified или cv-unqualified являются отдельными типами; однако они должны иметь одинаковое представление и alignment requirements.55

A compound type не квалифицируется cv-квалификаторами (если есть) типов, из которых он составлен. Любые cv-квалификаторы, применяемые к типу массива, влияют на тип элемента массива ([dcl.array]).

См [dcl.fct] и [class.this] относительно типов функций , которые имеют cv-qualifiers.

В cv-квалификаторах существует частичный порядок, поэтому можно сказать, что один тип отличается more cv-qualified от другого. В таблице 10 показаны отношения, составляющие этот порядок.

Таблица 10 - Отношения по const и volatile
no cv-qualifier < const
no cv-qualifier < volatile
no cv-qualifier < const volatile
const < const volatile
volatile < const volatile

В этом международном стандарте нотация cv (или cv1, cv2и т. Д.), Используемая в описании типов, представляет произвольный набор cv-квалификаторов, т. Е. Один из {const}, {volatile}, {const, volatile} или пустой набор. Для типа cv T, то top-level cv-qualifiers из этого типа являются те , которые обозначены cv. [ Example: Тип, соответствующий типу type-id const int& , не имеет квалификаторов CV верхнего уровня. Тип, соответствующий type-id volatile int * const тегу, имеет квалификатор cv верхнего уровня const. Для типа класса тип C, соответствующий классу , type-id void (C​::​* volatile)(int) const имеет квалификатор cv верхнего уровня volatile. ]end example

Cv-квалификаторы, применяемые к типу массива, присоединяются к базовому типу элемента, поэтому обозначение «cv T», где T является типом массива, относится к массиву, элементы которого квалифицируются таким образом. Тип массива, элементы которого имеют cv-квалификацию, также считается имеющим такую ​​же cv-квалификацию, что и его элементы. [Example:

typedef char CA[5];
typedef const char CC;
CC arr1[5] = { 0 };
const CA arr2 = { 0 };

Типом обоих arr1 и arr2 является «массив из 5 const char», а тип массива считается квалифицированным константой. ]end example

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