Создание экземпляра класса C++11

Я столкнулся со следующей формой создания экземпляра переменной класса 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 вопроса на эту тему:

  1. Можно ли построить объект класса enum с целочисленным типом в качестве параметра?
  2. Если 1 верно, почему X myX(id) не работает?

1 ответ

Решение

Вы не создаете перечисление с этим синтаксисом. Вместо этого вы используете альтернативный явный синтаксис приведения из 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;
Другие вопросы по тегам