Я столкнулся со следующей формой создания экземпляра переменной класса enum, и он компилируется без каких-либо предупреждений или ошибок в VS2012:
UINT32 id;
enum class X {apple, pear, orange};
X myX = X(id);
Кроме того, отправка X(id)
в качестве аргумента функции, ожидающей также скомпилированный параметр типа X.
Я не уверен, что результат всегда правильный или это просто странное поведение компилятора.
Тем не менее, пытаясь сделать X myX(id);
вместо вышесказанного вылилась ошибка компиляции:
ошибка C2440: «инициализация»: невозможно преобразовать из «UINT32» в «X».
Преобразование в тип перечисления требует явного приведения (static_cast, C-style или функционального).
Чтение стандарта C ++ 11 не помогло мне понять.
Итак, у меня есть 2 вопроса на эту тему:
X myX(id)
не работает?Вы не создаете перечисление с этим синтаксисом. Вместо этого вы используете альтернативный явный синтаксис приведения из UINT32
в enum class X
, Например, можно явно привести double к типу int следующим образом:
double p = 0.0;
int f = int(p)
Увидеть этот пост переполнения стека для всех различных синтаксисов приведения вы можете использовать в c ++.
Ваш код может быть эквивалентно написан с более распространенным синтаксисом приведения, например:
UINT32 id;
enum class X {apple, pear, orange};
X myX = (X)id;
Других решений пока нет …