Ответ 1
Пересмотрено с дополнительными примерами:
Раймонд Чен дает правильный ответ. Передавая не const-указатель (char *
) как ссылочный параметр указателя const (foo_ptr(const char * ¶m)
), вы рискуете вернуть тип указателя const (const char *
), и компилятор не позволит вам это сделать.
Здесь Raymond Chen пример, но я попытался объяснить, как все пойдет не так, если он скомпилирован, добавив дополнительные комментарии и код:
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 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, потому что нет шанса на возврат указателя на константу.
Поместив ключевое слово const
ПОСЛЕ *
в замедление параметров, вы сделаете именно это. Это означает изменение:
void foo_ptr(const char * & ptr)
to
void foo_ptr(const char * const & ptr)
и ваш компилятор будет счастлив.
Теперь вы не сможете сделать что-то вроде ptr = "readonlystring"
в приведенном выше примере, потому что это никогда не будет компилироваться. Исходя из вашего вопроса, который должен быть в порядке, потому что вы не сможете выполнить назначение const char &
в вашем исходном примере.