константное преобразование квалификации

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

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

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

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

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

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

Обновление:

c2 = c1;
c2 = c3;

person cpx    schedule 29.09.2011    source источник


Ответы (3)


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

  • без квалификатора cvconst
  • без квалификатора cvvolatile
  • без квалификатора cvconst volatile
  • const < const volatile
  • volatile < const volatile
person CB Bailey    schedule 29.09.2011
comment
Означает ли это, что конверсии, которые у меня есть в моем примере, не указаны стандартом? - person cpx; 29.09.2011
comment
@cpx: это означает, что они не разрешены, потому что int не more cv-qualified, чем const int, и вы не просто добавляете const способами, разрешенными 4.4./4. Если бы преобразование было разрешено, вы все равно не могли бы назначить c1, поскольку c1 равно const (независимо от квалификации cv указанного типа). - person CB Bailey; 29.09.2011
comment
@cpx: постредактирование: присваивание c2 = c3; является допустимым, поскольку типы одинаковы (по модулю константы верхнего уровня), а присваивание c2 = c1; является допустимым, поскольку const int более точно соответствует cv, чем int. Я только читаю спецификацию для вас, однако. - person CB Bailey; 29.09.2011
comment
@CharlesBailey: Спасибо. хотя я знал, что преобразование действительно, но когда я открыл спецификацию, у меня возникли сомнения. - person cpx; 29.09.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
person Alexander Gessler    schedule 29.09.2011

Я не знаю, где стандарт определяет тип «больше cv-qualifield».

It is §3.9.3/4

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

Таблица 6—отношения const и volatile


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.
person Nawaz    schedule 29.09.2011
comment
Означает ли это, что конверсии, которые у меня есть в примере, не указаны стандартом? то есть из int *const to int const*, который более соответствует требованиям cv, или как мы можем понять, что преобразование будет действительным? - person cpx; 29.09.2011
comment
@cpx: int * const и int const* несопоставимы с точки зрения большего соответствия cv, потому что int * const означает, что указатель является константным (т.е. T является int*), а int const* означает, что данные являются константными (т.е. T является int ). Константа применяется к разным объектам в каждом; T отличается в каждом случае. - person Nawaz; 29.09.2011