簡體   English   中英

C++ reinterpret_cast

[英]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不起作用嗎?

有人能告訴我為什么 reinterpret_cast 不起作用嗎?

AFAICS, reinterpret_cast應該可以正常工作,但是之后的分配應該會導致錯誤。

那是因為const GOK_UINT8*是指向const GOK_UINT8對象的非const指針,而const pGOK_UINT8是指向非const對象的const指針。
前者保護引用的對象,后者保護引用對象的指針。 如果允許分配,則可以更改const GOK_UINT8*旨在防止更改的對象。


請注意, typedef ed 指針的行為方式很奇怪。 那是因為在(C,因此也在)C++ 中const的奇怪聲明語法: const保護它左邊的東西,除非沒有任何東西,然后它保護它右邊的東西。 所以在T constT const*T類型的對象是受保護的,而在T* const ,指向T類型對象的指針是受保護的。 如果你有

typedef T* TPtr;

然后TPtr const再次使指針const const TPtr typedef ed 指針指向const或非const對象,你不能改變它。 你不能在TPtr附近填充一個const並期望它保護指針所指的對象。

(順便說一句,這就是為什么 STL 類必須同時定義iteratorconst_iterator 。)

是的 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM