C++ reinterpret_cast

Gok*_*kul 1 c++ reinterpret-cast

我不知道为什么这个简单的代码不起作用.有人可以解释一下吗?

int main()
{
    const char* c = "ret";
    typedef unsigned char GOK_UINT8;
    typedef GOK_UINT8* pGOK_UINT8;
    const pGOK_UINT8  y = reinterpret_cast<const GOK_UINT8*>(c);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么reinterpret_cast应该不起作用?

谢谢,Gokul.

sbi*_*sbi 12

有人能告诉我为什么reinterpret_cast应该不起作用?

AFAICS,reinterpret_cast应该可以正常工作,但之后的任务应该会导致错误.

这是因为a const GOK_UINT8*const指向const GOK_UINT8对象的非指针,而a const pGOK_UINT8const指向非const对象的指针.
前者保护所引用的对象,后者指向对象.如果允许分配,则可以更改const GOK_UINT8*要防止更改的对象.


请注意,typedefed指针表现得很奇怪.那是因为constin(C因此也是in C++)的奇怪的声明语法:A const保护它左边的东西,除非没有任何东西,然后它保护它的右边的东西.所以在in T const和in中T const*,类型的对象T是受保护的,而在T* const指向类型的对象的指针中T是受保护的.如果你有

typedef T* TPtr;
Run Code Online (Sandbox Code Playgroud)

然后TPtr const再次制作指针const.那样做const TPtr.一个typedef编辑或者指针指向const或非const对象,你不能改变的.你不能把a填充const到附近,TPtr并期望保护指针指向的对象.

(顺便说一下,这就是为什么STL类必须同时定义a iterator和a const_iterator.)

  • +1,正确答案.@Gokul:尝试这个而不是第6行:`const GOK_UINT8*tmp = reinterpret_cast <const GOK_UINT8*>(c); const pGOK_UINT8 y = tmp;`.您将看到reinterpret_cast正常工作,这是导致错误的分配中的类型不匹配.话虽如此,请注意您的代码展示了与行数不同的错误编码实践......我希望这仅用于实验.;-) (2认同)