преобразование квалификации const - PullRequest
3 голосов
/ 29 сентября 2011

Из (4.4 / 1) читается

Значение r типа «указатель на cv1 T» может быть преобразовано в значение типа «указатель на cv2 T», если «cv2 T»более квалифицированным по cv, чем «cv1 T».

Я не знаю, где стандарт определяет тип «cv-qualifield», но, как я понял, декларатор с const более квалифицирован по cv, чемa non-const.

Для следующих преобразований как соотносится цитата из стандарта или как узнать, какой из них менее или более квалифицирован для cv?

int *const c1 = 0;
int const* c2 = 0;
const int *const c3 = 0;

c1 = c2; // allowed
c1 = c3; // allowed

Обновление:

c2 = c1;
c2 = c3;

Ответы [ 3 ]

5 голосов
/ 29 сентября 2011

Таблица 6 в 3.9.3 / 4 дает частичное упорядочение cv-квалификаторов, а 3.9.3 / 4 также дает определение более квалифицированных cv .

  • без квалификатора cv <<code>const
  • без квалификатора cv <<code>volatile
  • без квалификатора cv <<code>const volatile
  • const <<code>const volatile
  • volatile <<code>const volatile
4 голосов
/ 29 сентября 2011

Поскольку c1 является переменной-указателем const (которая отличается от указателя на постоянные данные), ее нельзя изменить.Поэтому оба задания незаконны.

Этот стандарт относится к этому случаю:

int *d1 = 0;
const int* d2 = d1; // d2 is more cv-qualified than d1
const volatile int* d3 = d1; // d3 is more cv-qualified than d2
2 голосов
/ 29 сентября 2011

Я не знаю, где стандарт определяет тип 'more cv-qualifield'

Это §3.9.3 / 4

Существует (частичное) упорядочение по cv-квалификаторам, так что тип можно назвать более квалифицированным по cv , чем другой. Таблица 6 показывает отношения, которые составляют этот порядок.

Таблица 6 - отношения по постоянным и изменчивым значениям


no cv-qualifier  <  const  
no cv-qualifier  <  volatile   
no cv-qualifier  <  const volatile   
const            <  const volatile   
volatile         <  const volatile  

То есть

  • const T является более квалифицированным по классу , чем T.
  • volatile T является более квалифицированным сорта , чем T.
  • const volatile T является более квалифицированным по классу , чем T.
  • const volatile T является более квалифицированным по классу , чем const T.
  • const volatile T является более квалифицированным по классу , чем volatile T.
...