对void *

时间:2019-11-25 19:29:16

标签: c++ pointers casting

我有一个指向void *的const引用:

void* p;
void* const& x = p;

我想将其转换为对T *的const引用(对于某些struct T {};)。在我可以想到的三种方式中,默认选择static_cast不起作用:

T* const& y = static_cast<T* const&>(x);       // doesn't work
T* const& y = reinterpret_cast<T* const&>(x);  // works
T* const& y = (T* const&) x;                   // works

GCC出现以下错误:

error: invalid static_cast from type ‘void* const’ to type ‘T* const&’
       T* const& y = static_cast<T* const&>(x);

我想了解它的含义,以及是否有解决方法。


编辑(2019-11-26):

评论和答案中讨论了T* const&(和void* const&)是否为

  1. T*的const引用;或
  2. const T*的引用。

评论中的共识似乎是它是选项2。但是从下面的示例中,在我看来,这是选项1。

假设我有一个带有非常量函数T的类f()

struct T
{
  void f() {};  // NB: non-const
};

我们可以考虑两种选择:

const T*  x;
T* const& y;

通过它们调用f()会产生不同的效果:

x->f();   // compile-time error (passing ‘const T’ as ‘this’ argument discards qualifiers)
y->f();   // works fine

这是否表明选项1是正确的?有人可以为我调和吗?

2 个答案:

答案 0 :(得分:1)

您不能将引用绑定到任何其他类型(除了具有较低的简历资格的相同类型的版本,或者某些涉及通过特殊类型(例如col1读取单个字节的细微事情)之外的引用。如果您使用col2(包括通过C样式强制转换)强制解决问题,则使用结果(而不是强制返回)是不确定的行为。

您可以(仅用unsigned char&即可将reinterpret_cast 转换为static_cast,并且可以像

void*

,以便您以后可以在任何地方写入T*来跟踪const auto y=[&] {return static_cast<T*>(p);}; 的当前值。 (由于它按值返回,因此您确实无法根据需要编写p。)

答案 1 :(得分:0)

看看您不想通过某个指针修改值的原始问题,以下方法应该起作用。对其进行模板化应该得到相同的结果。如有需要,请引入参考,但结果会相同。

void myfunc1(int* intptr)
{
    (*intptr)++;
    std::cout << "In myfunc1 "<< *intptr<<"\n";
}

void myfunc2(const int* intptr)
{
    //(*intptr)++; //modification not possible
    std::cout << "In myfunc2 " << *intptr << "\n";
}

int main()
{       
    int* val = new int;
    *val = 32;

    void*  p = val; 

    std::cout << "Before myfunc1 " << *val << "\n";
    myfunc1(static_cast<int*>(p));
    std::cout << "After myfunc1 "<<*val<<"\n";

    //no modification via pointer to const
    const int* x = static_cast<const int*>(p);
    myfunc2(x);
    std::cout << "After myfunc2 " << *val << "\n";