Постоянная ссылка на указатель void * - PullRequest
1 голос
/ 06 февраля 2011

Я хочу присвоить псевдоним переменной void *, чтобы я мог использовать ее с другим именем. Это означало бы, что я мог бы установить указатель (p) на что-то, и переменная псевдонима (pp) также была бы установлена ​​на тот же адрес.

Например:

class foo {
  private:
    static void* p; //I just happen to need this for static variable
    static const void*& pp;
};

//in cpp:
const void*& foo::pp = foo::p;

GCC жалуется:

ошибка: неверная инициализация ссылка типа 'const void * &' из выражение типа 'void *'

Ответы [ 2 ]

9 голосов
/ 06 февраля 2011

То, что вы пытаетесь сделать, т.е. установить 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; будет разрешено

1 голос
/ 06 февраля 2011

const void *& интерпретируется как ссылка на константный указатель void, в то время как я думаю, что здесь вам нужна ссылка на константный указатель на void. Попробуйте вместо этого:

void * const &foo::pp = foo::p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...