С ++ 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)) не вызывает ошибок.


person Adam Martin    schedule 10.07.2016    source источник
comment
разные типы, не стоит ли использовать reinpterpret_cast?   -  person Feng Wang    schedule 10.07.2016
comment
Вы можете преобразовать bool в double, но это не значит, что указатель bool можно осмысленно рассматривать как двойной указатель.   -  person Kerrek SB    schedule 10.07.2016
comment
Я думал, что типизированное перечисление - это, по сути, тот же тип данных? Поскольку он набран как int, компилятор должен принять это static_cast no? Очевидно, что использование reinterpret_cast работает, но это немного запах кода.   -  person Adam Martin    schedule 10.07.2016
comment
Да, это запах кода, но, возможно, вы пытаетесь сделать что-то вонючее. С int* y вам разрешено делать *y = 44. С side* y это не так. Вы убираете страховочную сетку.   -  person zneak    schedule 10.07.2016
comment
@zneak ... Если подумать, это воняет, имеет смысл. Я думаю, что комбинация вашего комментария и комментария Керрека была бы ответом, я действительно не продумывал границы. Не совсем уверен, как избавиться от запаха кода в моем личном случае, вероятно, придется придерживаться reinterpret_cast, так как я предпочитаю использовать миллион static_cast.   -  person Adam Martin    schedule 10.07.2016


Ответы (1)


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

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

person Zan Lynx    schedule 10.07.2016