Неявное преобразование из int в перечислимый класс в операторе 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; выдает ошибку в каждом компиляторе.

Какой из них понял это правильно?

2

Решение

Стандартный раздел 4 «Стандартные преобразования», только каждый список незаданной Перечисления. Поэтому сильные перечисления делают не иметь какие-либо стандартные преобразования, и вы должны использовать static_cast в любом направлении.

Вы могли бы утверждать, что этот вид явности — весь смысл сильных перечислений. Они не действуют как целые числа в ответ, а скорее требуют явного объявления намерения. Обратите внимание, что @DyP switch заявления явно поддерживают сильные перечисления и делают не требует ручного преобразования в какой-то целочисленный тип.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector