【问题标题】:Constant reference to void* pointer对 void* 指针的常量引用
【发布时间】:2011-02-06 03:42:28
【问题描述】:

我想给一个 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*' 类型的表达式

【问题讨论】:

  • 您的声明与您的定义不符:前者是const void*& 类型(引用指向 const void 的指针),而后者是类型 const void*& const(对指向 const void 的指针的常量引用),两者都不兼容“指向无效的指针”。
  • Adam Rosenfield:哎呀,那是打字错误。实际代码是 'const void*&' 并且仍然是错误的。
  • 你能有一个静态成员作为引用吗?另外,我建议您重新考虑一下为什么首先需要使用 void 指针。这通常表明设计不佳。
  • @Dima:我的其他静态引用工作正常。空指针实际上是做我正在做的事情的最佳方式。
  • 您修改了您的问题,然后降低了回答您最初发布内容的人的评分?

标签: c++ pointers static reference constants


【解决方案1】:

您正在尝试做的事情,即设置一个 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' );

这当然应该是非法的,因为我正在尝试修改 const 的 x。

这就是为什么不允许您尝试做的事情。

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

【讨论】:

    【解决方案2】:

    const void *& 被解释为对 const void 指针的引用,而我认为您在这里想要的是对 void 指针的 const 引用。试试这个:

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

    【讨论】:

    • 我认为你有它倒退。 const void*& 应该是对非常量 void 的常量引用。您的代码不允许我更改 foo:pp。
    • @Pepe:是的,你不能改变foo::pp。如果您希望能够更改它,那么您为什么需要const 呢?就让它void *&foo::pp = foo::p
    • 您不能将引用更改为指向另一个对象。你对你真正想要什么非常模糊,然后给给你正确答案的人-1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2014-12-16
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多