2010-07-29 2 views
1

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

Thanks, Gokul.

+0

Также обратите внимание, что 'reinterpret_cast' очень тупой инструмент, который следует использовать очень экономно. –

+1

Подсказка. Принимая сложные утверждения в своих атомах и размещая их на отдельных линиях, это хороший первый шаг, чтобы утверждать, что проблема действительно * есть * в фрагменте кода, который вы так считаете. (См. Мой комментарий к sbi.) – DevSolar

ответ

12

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

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

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


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

typedef T* TPtr; 

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

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

+2

+1, правильный ответ. @Gokul: попробуйте это вместо строки 6: 'const GOK_UINT8 * tmp = reinterpret_cast (c); const pGOK_UINT8 y = tmp; '. Вы увидите, что reinterpret_cast работает нормально, это несоответствие типа в присваивании, которое приводит к ошибке. При этом помните, что ваш код демонстрирует столько же неправильных методов кодирования, сколько имеет линии ... Надеюсь, это только для экспериментов. ;-) – DevSolar

2

Да ВОО правильно.

Модифицированный код соответственно,

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); 
Смежные вопросы