То, что вы пытаетесь сделать, т.е. установить const void * и указать void *, похоже, что оно должно быть законным и достаточно безвредным, но это не так, и это незаконно по уважительной причине. Помните, что ссылка - это просто псевдоним того, на что она ссылается.
Скажем, мы могли бы сделать это:
const void* & foo::pp = foo::p;
// незаконно, так как мы увидим, к чему это приведет
Теперь предположим, что у меня есть это:
const char *x = "Hello world";
Поскольку foo :: pp является указателем на const, я могу указать его на x следующим образом:
foo::pp = x;
// законно, поскольку я могу указать const void * на const memory
но p теперь также указывает на x, потому что pp является ссылкой на p.
Так что теперь я мог сделать это:
memset( foo::p, 8, 'X' );
, что, конечно, должно быть незаконно, так как я пытаюсь изменить x, который является const.
Вот почему то, что вы пытаетесь сделать, не допускается.
void * const& foo::pp = p;
будет разрешено