Неявное преобразование из 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 операторы явно поддерживают сильные перечисления и не требуют ручного преобразования в некоторый целочисленный тип.

Другие вопросы по тегам