1

我不知道为什么这个简单的代码不起作用:

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;
}

有人可以告诉我为什么reinterpret_cast不起作用吗?

4

2 回答 2

12

有人能告诉我为什么 reinterpret_cast 不应该工作吗?

AFAICS,reinterpret_cast应该可以正常工作,但是之后的分配应该会导致错误。

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


请注意,typedefed 指针的行为很奇怪。这是因为const(C 和)C++ 中奇怪的声明语法:Aconst保护它左边的东西,除非没有任何东西,然后它保护它右边的东西。因此 inT const和 in 中T const*,类型的对象T是受保护的,而在T* const指向类型对象的指针中T是受保护的。如果你有

typedef T* TPtr;

然后TPtr const再次使指针const。也是如此const TPtrtypedefed 指针要么指向对象,要么指向constconst对象,您无法更改它。您不能将 aconst塞入附近TPtr并期望它保护指针所指的对象。

(顺便说一句,这就是 STL 类必须同时定义 aniterator和 a 的原因const_iterator。)

于 2010-07-29T08:13:18.743 回答
2

是的,sbi 是正确的。

相应地修改了您的代码,

const char* c = "ret";
typedef unsigned char GOK_UINT8;
typedef const GOK_UINT8* pGOK_UINT8;
pGOK_UINT8 y = reinterpret_cast<const GOK_UINT8*>(c);
printf("%s", y);
于 2010-07-29T08:22:36.257 回答