2016-05-13 6 views
2

В приведенном ниже коде, почему возвращенный указатель p разрешен для изменения? Если f вместо этого возвращает «const int *», тогда компилятор будет жаловаться на ошибку неправильного совпадения в строке «int * p = f()». Почему он делает то же самое для «int * const»?Возврат «int * const» из функции

кстати: Я знаю, что в коде есть утечки памяти, но это не имеет никакого отношения к вопросу.

int * const f() { 
    return new int(23); 
} 
int main(){ 
    int * p=f(); 
    p= new int(35); 
    return 0; 
} 
+1

Очень похоже: http://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int-const-int-const-and-int-const –

ответ

3

Потому что вы возвращаете это неизменяемый указатель - не указатель на неизменяемые данные.

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

Вот почему возвращение const-квалифицированных простых типов по значению из функций не имеет смысла и фактически вызывает предупреждение в некоторых компиляторах.

+0

Это правда. вы должны использовать 'int const *' вместо 'int * const'. – lolski

+0

Кроме того, 'int const * const' объявит указатель, который является постоянным в том месте, где он указывает, а также фактическое значение в этом месте – lolski

0

В приведенном ниже коде, почему возвращенному указателю 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-уровня верхнего уровня.

0

*const - постоянный указатель, в то время как const * - указатель на константу. Последнее является неизменным значением; вы можете, конечно, назначить это значение переменной, например, вы должны написать int x = 42;. Первый указывает на неизменяемый объект, поэтому присвоение этой переменной переменной, которая должна указывать на изменяемый объект, предположительно нарушала бы постоянство этого объекта.

Смежные вопросы