7 Standard conversions [conv]

7.5 Qualification conversions [conv.qual]

cv-decomposition ТипаT представляет собой последовательность ,cvi иPi таким образом, чтоT является «cv0P0cv1P1cvn1Pn1cvnU» для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 examplenTcv1,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

Эти правила гарантируют, что константная безопасность сохраняется при преобразовании.