Используйте `default` только для обработки общих случаев
Причина
Ясность кода. Расширенные возможности обнаружения ошибок.
Пример
enum E { a, b, c, d };
void f1(E x)
{
switch (x) {
case a:
do_something();
break;
case b:
do_something_else();
break;
default:
take_the_default_action();
break;
}
}
Здесь чётко видно, что есть действие по умолчанию, а случаи a и b особые.
Пример
Но что, если действия по умолчанию нет, и нужно обработать только определённые случаи? В таком случае используйте пустой default, иначе невозможно понять, намеренно ли вы обрабатываете все случаи:
void f2(E x)
{
switch (x) {
case a:
do_something();
break;
case b:
do_something_else();
break;
default:
// для остальных случаев ничего не делать
break;
}
}
Если опустить default, сопровождающий код или компилятор могут обоснованно предположить, что вы намеревались обработать все случаи:
void f2(E x)
{
switch (x) {
case a:
do_something();
break;
case b:
case c:
do_something_else();
break;
}
}
Забыли ли вы про случай d или намеренно его исключили? Пропуск случая обычно происходит, когда в перечисление добавляется новое значение, а разработчик не добавляет его во все операторы switch по перечислителям.
Контроль
Отмечать операторы switch по перечислению, не обрабатывающие все перечислители и не имеющие default. Это может давать слишком много ложных срабатываний в некоторых кодовых базах; в таком случае отмечать только switch, обрабатывающие большинство, но не все случаи (такова была стратегия самого первого компилятора C++).