Это функция безопасности типа. Неявные преобразования имеют долгую историю связанных с этим проблем в C ++. Взгляните на книгу Стивена Дьюхерста "C ++ Gotchas" - самая длинная глава посвящена преобразованиям.
Напомним, что перечисление - это не что иное, как способ связать постоянное значение с понятным именем. Таким образом, существует ограниченный, документированный набор возможных значений, и путем неявного преобразования вы значительно расширяете домен без какого-либо уведомления. Пример:
void f(uint16_t arg); // arg can have 65536 different values
enum class Apples : uint16_t { GRANNY_SMITH = 1 }; // one possible value
Если это скомпилировано:
f(Apples::GRANNY_SMITH);
Вы только что отказались от ограничений без уведомления. Вместо
f(static_cast<uint16_t>(Apples::GRANNY_SMITH));
яснее и страшнее. Неуклюжий характер актерского состава говорит вам «почему вы вообще это делаете?», И ответить на этот вопрос не должно быть слишком легко. Вы создали перечисление, чтобы ссылаться на возможные значения, печатая связанные с ними имена, верно?