cv-decomposition ТипаT представляет собой последовательность ,cvi иPi таким образом, чтоT является «cv0P0cv1P1⋯cvn−1Pn−1cvnU» дляn>0, где каждыйcvi представляет собой наборcv-qualifiers, и каждыйPi представляет “pointer to”, “pointer to member of class Ci of type”«массивNi», или «array of unknown bound из». ЕслиPi обозначает массив, cv-квалификаторыcvi+1 для типа элемента также принимаются как cv-квалификаторыcvi массива. [ Example: Тип, обозначенный символом, type-idconst int ** имеет два cv-разложенияU : «int» и «указатель наconst int». ] Набор cv-квалификаторов после первого в самом длинном cv-разложении , то есть, называется of . — end example nTcv1,cv2,…,cvncv-qualification signature T
Два типаT1 иT2 есть,similar если они имеют cv-разложения с одинаковымиn , так что соответствующиеPi компоненты одинаковы и типы, обозначенныеU одинаковыми.
Выражение prvalue типаT1 может быть преобразовано в тип,T2 если выполняются следующие условия, гдеcvji обозначает cv-квалификаторы в сигнатуре cv-qualificationTj:60
T1 иT2 похожи.
Для каждогоi>0, еслиconst находится в,cv1i тоconst есть вcv2i, и аналогично дляvolatile.
Если символыcv1i иcv2i разные, тоconst находится в каждомcv2k for0<k<i.
[ Note: Если программа могла назначить указатель типаT** указателю типаconstT** (то есть, если была разрешена строка № 1 ниже), программа могла непреднамеренно изменитьconst объект (как это делается в строке № 2). Например,
int main() { const char c = 'c'; char* pc; const char** pcc = &pc; // #1: not allowed *pcc = &c; *pc = 'C'; // #2: modifies a const object }
— end note ]
[ Note: Prvalue типа «указатель наcv1T» может быть преобразовано в prvalue типа «указатель наcv2T», если «cv2T» более квалифицировано cv, чем «cv1 T». Prvalue типа «указатель на членX типаcv1 T» может быть преобразовано в prvalue типа «указатель на членX типаcv2T», если «cv2 T» более квалифицировано cv, чем «cv1T». ] — end note
[ Note: Типы функций (включая те, которые используются в указателях на типы функций-членов) никогда не квалифицируются cv ([dcl.fct]). ] — end note
Эти правила гарантируют, что константная безопасность сохраняется при преобразовании.