Почему C ++ требует низкоуровневой константной квалификации для обоих объектов при копировании объекта в другой? - PullRequest
0 голосов
/ 28 октября 2018

Я читал C ++ - Учебник для начинающих (от Жозе Ладжи и Стэнли Б. Липпмана), когда натолкнулся на этот раздел о верхнем и низком уровне const с.В одном абзаце говорится, что при копировании объекта верхний уровень const s игнорируется.

Например.

const int i = 24;
int i2 = i;

Где квалификация const верхнего уровня в i игнорируется при копировании в i2 .

Однако, это также заявляет

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

Теперь, обычно, когда в C ++ есть такое правило, есть причина.Я считаю, что их понимание является основополагающим для понимания правила и, следовательно, облегчения его запоминания (это похоже на понимание математической концепции вместо запоминания формул).Однако я не нахожу логического правила, которое бы вписывалось здесь в загадку.

Таким образом, мой вопрос:

  1. Почему при копировании объекта верхнего уровня const квалификация игнорируется?(Есть раздел, объясняющий, почему в книге тоже, но я не могу его понять)

Копирование и объект не изменяют скопированный объект.В результате не имеет значения, является ли объект, скопированный или скопированный, const

В чем причина того, что низкоуровневый const никогда не игнорируется при копировании объекта?(низкоуровневая const квалификация необходима для обоих объектов)

1 Ответ

0 голосов
/ 28 октября 2018

Случай верхнего уровня: вы создаете копию объекта const, поэтому не имеет значения, является ли ваша копия константной или нет, потому что (при условии правильного типа const) вы не можете изменить оригинал с помощью копии.

Случай низкого уровня: Вы делаете копию дескриптора на другой объект.Оригинальный дескриптор не позволяет модифицировать объект, на который он ссылается.Разрешение игнорировать низкоуровневое const означало бы, что вы можете получить дескриптор, который позволяет вам изменять указанный объект, нарушая правильность const.

...