pch2
- это char*
, а не char const*
. Вы не можете привязать ссылку типа char const*&
к указателю типа char*
, поэтому следующее будет неправильно сформировано:
char* p(0);
char const*& r(p);
Аналогично, если бы ваша функция была объявлена как void f(char const*& pch)
, вы не смогли бы вызвать ее с аргументом char*
из-за несоответствия const-qualifier.
Причина того, что ваш пример работает, заключается в том, что константная ссылка может связываться с временной, а компилятор может создать временную копию вашего указателя char*
, присвоить этому временному типу char const*
и связать ссылку pch
к этому временному указателю.