В приведенном ниже коде, почему возвращенному указателю p разрешено изменять?
Поскольку тип p
составляет int *
. Поскольку указатель не const, он может быть изменен. Если вы хотите p
не быть изменяемыми, то вы должны сделать его конструкцию: int * const p
Если F вместо возвращает «Const INT *», то компилятор выдаст сообщение об ошибке неправильно матча типа в строке «ИНТ * р = f() "
Указатель на константу не конвертируется в указатель на не-const. Этот перевод не допускается языком, потому что он нарушит корректность.
Почему он делает то же самое для «int * const»?
Я думаю, вы имеете в виду, чтобы спросить «Почему компилятор позволяет назначить int * const
к int *
переменной?»
Копирование объекта const в объект, не являющийся объектом const, не нарушает const-correctness. Когда p
не является константой, это нормально, чтобы изменить его, а временный константа, возвращаемый f
, остается неизменным через весь (короткий) срок службы.
Константа временного редко имеет смысл и поэтому возвращает значение const-уровня верхнего уровня.
Очень похоже: http://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int-const-int-const-and-int-const –