Другие уже правильно ответили на ваш вопрос, но, похоже, вы до сих пор не поняли его, поэтому я постараюсь сделать его максимально понятным для вас.
void person::copy( char*& n, const char*& p)
Эта функция ожидает в качестве второго аргумента неконстантную ссылку на константный указатель (а не константную ссылку на указатель, как вы могли бы подумать!).
Когда вы пытаетесь вызвать эту функцию, передавая в качестве второго аргумента указатель (не указатель const), компилятор не может создать для него ссылку, просто потому, что он ожидает привязки ссылки к указателю const, а это не так. разрешено неявно приводить указатель к константному указателю, поскольку неконстантные ссылки могут не связываться с r-значениями (временными значениями).
Если вы хотите, чтобы функция ожидала константную ссылку на указатель константы, вы должны изменить ее сигнатуру, как показано ниже:
void person::copy( char*& n, const char* const& p)
Здесь важно понимать, что компилятор неявно преобразует предоставленный указатель в указатель const перед привязкой ссылки, что разрешено в этом случае, так как ссылка const может связывать как значения rvalue, так и значения l.
Аналогично, если вы хотите, чтобы функция ожидала константную ссылку на указатель, что, вероятно, было вашим первоначальным намерением, тогда подпись должна быть такой, как показано ниже:
void person::copy( char*& n, char* const& p)
Здесь компилятору не нужно ничего явно приводить, поскольку предоставленный аргумент уже соответствует типу, который ссылка ожидает связать.
Надеюсь, я дал вам ясное и подробное объяснение, и вы правильно поняли, что вызвало проблему, что действительно важно, но, тем не менее, я бы настоятельно советовал вам не писать свой код таким образом, а вместо этого следовать рекомендациям. дано другими.