C ++ reinterpret_cast

时间:2010-07-29 08:05:36

标签: 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;
}

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

谢谢, 戈库尔。

2 个答案:

答案 0 :(得分:12)

  

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

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

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


请注意,typedef ed指针表现得很奇怪。这是因为C语言中const的奇怪声明语法(C也因此也在C ++中): A const保护左边的东西,除非没有任何东西,然后它保护正确的事情。因此在T constT const*中,T类型的对象受到保护,而T* const中指向类型对象的指针受到保护。 T受到保护。如果你有

typedef T* TPtr;

然后TPtr const再次生成指针constconst TPtr也是如此。 typedef ed指针指向const或非const对象,您无法更改它。你不能将const填入TPtr附近,并期望保护指针所指的对象。

(顺便说一句,这就是为什么STL课程必须同时定义iteratorconst_iterator。)

答案 1 :(得分: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);