2016-07-10 5 views
4

У меня есть набранное перечислениеC++ 11 Кастинг перечислений к Интс

enum side : int {_white=0, 
       _yellow=1, 
       _green=2, 
       _blue=3, 
       _red=4, 
       _orange=5}; 

Однако, используя GCC-5, компилятор говорит, что он не может использовать static_cast по следующему сценарию:

side value 
function(static_cast<int *>(&value)) 

Почему в том, что? Выполнение static_cast<int>(value)) не вызывает ошибок.

+2

разные типы, не следует ли использовать 'reinpterpret_cast'? –

+5

Вы можете преобразовать bool в double, но это не означает, что указатель bool может быть осмысленно трактован как двойной указатель. –

+0

Я думал, что типизированное перечисление было по существу тем же самым типом данных? Поскольку он вводится как 'int', компилятор должен иметь возможность принять это' static_cast' нет? Очевидно, что использование 'reinterpret_cast' работает, но это немного запах кода. –

ответ

5

Листинг типа указателя отличается от преобразования типа. Доступ через указатель оставляет байты одинаковыми, но читает их по-разному. Это не безопасно для перечисления, потому что это могут быть разные размеры int.

Преобразование типа безопасно, потому что оно преобразует перечисление в int как копию. Исходное перечисление может быть одним байтом или двумя байтами, но это не имеет значения после его копирования в 4 или 8 байтов.

 Смежные вопросы

  • Нет связанных вопросов^_^