2011-02-06 29 views
1

我想要别名void *变量,以便我可以使用其他名称。这意味着我可以将指针(p)设置为某些内容,并且别名变量(pp)也将设置为相同的地址。对void *指针的常量引用

例如:

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抱怨:

error: invalid initialization of reference of type 'const void*&' from expression of type 'void*'

+0

您的声明不符合您的定义:前者是类型`常量无效*&的'(参考指针常量无效),而后者是一个类型`常量无效的* const(常量引用指向const void的指针),它们都不兼容“void指针”。 – 2011-02-06 03:59:11

+0

Adam Rosenfield:哎呀,那是输入错误。实际的代码是'const void *&',仍然是错误的。 – Pubby 2011-02-06 04:04:56

回答

9

你正在尝试做的,即设置一个const void *的&指向到void *似乎应该是合法的,并足够无害的,但它不是,它是非法的有一个很好的理由。请记住,引用只是它引用的别名。

说,我们可以这样做:

const void* & foo::pp = foo::p; //非法,我们会看到什么导致

现在假设我有这样的:

const char *x = "Hello world";

为Foo :: pp是一个指向const的指针,我可以这样指向x:

foo::pp = x; //合法,因为我可以指向一个const v oid *到const内存

但是现在p也指向x,因为pp是对p的引用。

所以,现在我可以这样做:

memset(foo::p, 8, 'X');

这当然应该是非法的,因为我想修改X是常量。

这就是为什么你试图做的事情是不允许的。

void * const& foo::pp = p;将被允许

1

const void *&被解释为一个const空指针引用,而我想你想要的这里是一个常量引用到void指针。试试这个:

void * const &foo::pp = foo::p;