C ++ reinterpret_cast - PullRequest
       5

C ++ reinterpret_cast

1 голос
/ 29 июля 2010

Я не знаю, почему этот простой код не работает. Может кто-нибудь, пожалуйста, объясните мне?

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 не должен работать?

Спасибо, Gokul.

Ответы [ 2 ]

12 голосов
/ 29 июля 2010

Может кто-нибудь сказать мне, почему reinterpret_cast не должен работать?

AFAICS, reinterpret_cast должно работать нормально, но последующее назначение должно вызвать ошибку.

Это потому, что const GOK_UINT8* - это не const указатель на const GOK_UINT8 объектов, в то время как const pGOK_UINT8 является const указателем на не const объектов.
Первый защищает указанный объект, второй - указатель на этот объект. Если назначение будет разрешено, вы можете изменить объект, который const GOK_UINT8* предназначен для защиты от изменения.


Обратите внимание, что typedef ed указатели ведут себя странно таким образом. Это происходит из-за странного синтаксиса объявления const в (C и, следовательно, также в) C ++: A const защищает объект слева, если ничего нет, то он защищает объект справа . Таким образом, в T const и в T const* объект типа T защищен, а в T* const указатель на объект типа T защищен. Если у вас есть

typedef T* TPtr;

затем TPtr const снова делает указатель const. Так же const TPtr. typedef ed указатель указывает либо на const, либо на не const объекты, вы не можете это изменить. Вы не можете вставить const в окрестности TPtr и ожидать, что для защиты объектов, на которые ссылается указатель.

(Кстати, именно поэтому классы STL должны определять iterator и const_iterator.)

2 голосов
/ 29 июля 2010

Да, 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...