Предполагается, что перечислимые классы являются сильными перечислениями в том смысле, что они неявно не преобразуются в int
. Например:
enum class EC { a, b };
Однако при переключении такого «сильного перечисления»:
int sw(EC ec) {
switch (ec) {
case EC::a: return 0;
case EC::b: return 1;
}
}
g cc -Wreturn-type
- хочет добавить предложение default
к переключателю, даже если охвачены все допустимые значения перечисления:
warning: control reaches end of non-void function [-Wreturn-type]
В старом (не классовом) перечислении это имеет смысл, поскольку любой int
мог быть случайно преобразован в EC
. Но я (очевидно, ошибочно) предположил, что присвоение недопустимого члена перечисления классу перечисления было UB.
Как я могу использовать действительно сильные классы перечисления, когда компилятор понимает, что такие функции, как sw
охватывают все возможные пути? Конечно, я мог бы просто добавить ветку default:
, которая, как я знаю, никогда не сработает, но я хочу убедиться, что добавление большего числа членов к EC
в будущем вызовет предупреждение переключатель .