Создание экземпляра класса 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 вопроса на эту тему:
- Можно ли построить объект класса enum с целочисленным типом в качестве параметра?
- Если 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;