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;
выдает ошибку в каждом компиляторе.
Какой из них понял это правильно?
Стандартный раздел 4 «Стандартные преобразования», только каждый список незаданной Перечисления. Поэтому сильные перечисления делают не иметь какие-либо стандартные преобразования, и вы должны использовать static_cast
в любом направлении.
Вы могли бы утверждать, что этот вид явности — весь смысл сильных перечислений. Они не действуют как целые числа в ответ, а скорее требуют явного объявления намерения. Обратите внимание, что @DyP switch
заявления явно поддерживают сильные перечисления и делают не требует ручного преобразования в какой-то целочисленный тип.
Других решений пока нет …