我在看https://en.cppreference.com/w/cpp/language/reinterpret_cast时,发现它指定了我们可以始终转换为的合法类型:

  • byte*
  • char*
  • unsigned char*

  • 但是我没有在列表中看到void*。这是疏忽吗?我的用例需要reinterpret_cast,因为我是从int**转换为void*。最后,我将把void*转换回int**

    最佳答案

    从一个类型的指针到另一个包含void的类型的指针总是合法的,因此,如果T是一个类型,则这是合法的C++:

    T* x;
    void *y = reinterpret_cast<void *>(x);
    

    在现实世界中,从未使用过它,因为void *是一种特殊情况,并且您可以使用static_cast获得相同的值:
    void *y = static_cast<void *>(x); // equivalent to previous reinterpret_cast
    

    (实际上,上面的转换是隐式的,可以简单地写为void *y = x;-感谢Michael Kenzel的注意)

    更明确地说,该标准甚至在C++ 17的n4659草案中说8.2.10重新解释类型转换[expr.reinterpret.cast],第7节



    当您将byte和char称为唯一合法类型时,仅对那些类型取消引用转换后的指针是合法的。这里不包括void,因为您永远都不能取消引用void *

    具体回答您的问题



    该标准保证第一个是标准(隐式读取)转换:



    因此,这始终是合法的:
    int **i = ...;
    void *v = i;
    

    对于反向转换,标准说(在static_cast段中):



    所以这也是合法的
    int **j = static_cast<int **>(v);
    

    并且该标准确保j == i

    关于c++ - 重新解释为空是合法的*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55728740/

    10-11 00:51