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問題なく動作するはずですが、その後の割り当てでエラーが発生するはずです。

これconst GOK_UINT8*は、 a がオブジェクトへの非constポインターconst GOK_UINT8であるのに対し、 aconst pGOK_UINT8constconstオブジェクトへのポインターであるためです。
前者は参照されるオブジェクトを保護し、後者はオブジェクトを参照するポインタを保護します。割り当てが許可される場合は、変更const GOK_UINT8*から保護することを意図したオブジェクトを変更できます。


typedefそのように ed ポインターが奇妙な動作をすることに注意してください。これは、constin (C および in) C++の奇妙な宣言構文によるものです。Aconstは、何もない限り左側のものを保護し、次に右側のものを保護します。したがって、T constおよび ではT const*、型のオブジェクトTは保護されT* constていますが、型のオブジェクトへのポインターでTは保護されています。あなたが持っている場合

typedef T* TPtr;

次にTPtr const再びポインターを作成しますconst。そうconst TPtrです。ed ポインターは、オブジェクトまたは非オブジェクトtypedefを指しており、それを変更することはできません。の近くに a を詰め込み、ポインターが参照するオブジェクトを保護することを期待することはできません。constconstconstTPtr

iterator(ところで、これが STL クラスが anと 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 に答える