Неявное преобразование из int в enum класс в операторе switch
enum class pid
{
Alpha, Beta, Gamma
};
int main()
{
int propId = 2;
switch(propId)
{
case pid::Alpha:
case pid::Beta:
case pid::Gamma:
break;
}
}
Вышеуказанный фрагмент прекрасно компилируется в msvc2012 (и работает), но не работает в clang-3.4 и g++-4.8. Это требует static_cast<pid>(propId)
для использования внутри предложения о переключателе.
Между прочим, простое назначение без явного приведения, такого как pid a = propId;
выдает ошибку в каждом компиляторе.
Какой из них понял это правильно?
1 ответ
В стандартном разделе 4 "стандартные преобразования" перечисляются только неперечисленные перечисления. Поэтому сильные перечисления не имеют стандартных преобразований, и вы должны использовать static_cast
в любом направлении.
Вы могли бы утверждать, что этот вид явности - весь смысл сильных перечислений. Они не действуют как целые числа в ответ, а скорее требуют явного объявления намерения. Обратите внимание, что @DyP switch
операторы явно поддерживают сильные перечисления и не требуют ручного преобразования в некоторый целочисленный тип.