Пересмотрено с большим количеством примеров: Раймонд Чен дает правильный ответ.Передавая неконстантный указатель (char *
) в качестве ссылочного параметра константного указателя (foo_ptr(const char * ¶m)
), вы рискуете вернуть тип константного указателя (const char *
), и компилятор не позволит вам сделать это.
Вот пример Раймонда Чена , но я попытался объяснить, как все пойдет не так, если он скомпилируется, добавив дополнительные комментарии и код:
void foo_ptr(const char * & ptr)
{
//Valid assignment, and the char * is now pointing to a const
//array of "readonlystring"
ptr = "readonlystring";
}
...
//inside main
char *ptr = malloc(10*sizeof(char));
//See you can edit ptr, it's not const.
ptr[0] = 'a';
ptr[1] = 'b';
//this should not compile, but lets assume it did..
foo_ptr(ptr);
//Oh no, now ptr[0] is 'r' inside of constant memory,
//but now since ptr isn't declared const here I can overwrite it!
//But luckily most (all?) compilers actually fail to compile this code.
ptr[0] = 'b';
Но если выизмените ваш параметр, чтобы вы не могли повлиять на значение, на которое указывает указатель, тогда компилятор пропустит вас неконстантно, потому что нет никакой вероятности, что будет возвращен константный указатель.
Поместив ключевое слово const
ПОСЛЕ *
в замедление вашего параметра, вы делаете именно это.Это означает изменение:
void foo_ptr(const char * & ptr)
на
void foo_ptr(const char * const & ptr)
, и ваш компилятор будет счастлив.
Теперь вы не сможете сделать что-то вроде ptr = "readonlystring"
в приведенном выше примере, потому что это никогда не скомпилируется.Исходя из вашего вопроса, все должно быть в порядке, потому что вы не сможете выполнить присваивание const char &
в исходном примере.