Всегда вставляйте метку default в оператор switch
Метка default защищает от расширения перечисления или других используемых констант.
Если вы уверены, что операторы под меткой default никогда не будут выполняться, используйте **assert** из <cassert> или другие механизмы, чтобы выразить этот факт. Это обеспечивает дополнительную безопасность через проверки на этапе выполнения и показывает, что случай default не просто «ничего не делает».
Неправильно:
switch(enums.weight) {
case tbwThin:
break;
case tbwMedium:
width *= 2;
break;
case tbwThick:
width *= 3;
break;
// Отсутствует default:
}
Правильно:
#include <cassert>
switch(enums.weight) {
case tbwThin:
break;
case tbwMedium:
width *= 2;
break;
case tbwThick:
width *= 3;
break;
default:
assert(false);
}
Важно! assert игнорируется в Release режиме. Чтобы обработать ошибку в релизе, можно использовать std::unreachable из C++23 или :
switch(enums.weight) {
case tbwThin:
break;
case tbwMedium:
width *= 2;
break;
case tbwThick:
width *= 3;
break;
default:
std::unreachable(); // C++23
}
или бросать кастомное исключение:
struct unreachable_error : std::logic_error {
using std::logic_error::logic_error;
};
switch(enums.weight) {
case tbwThin:
break;
case tbwMedium:
width *= 2;
break;
case tbwThick:
width *= 3;
break;
default:
throw unreachable_error("Unhandled enum value in Weight switch");
}
Важно! Пишите обработчик в default, а не просто инструкцию break. В противном случае вы просто глушите потенциальную ошибку в программе, которая даст о себе знать в самый не подходящий момент.
Неправильно:
struct unreachable_error : std::logic_error {
using std::logic_error::logic_error;
};
switch(enums.weight) {
case tbwThin:
break;
case tbwMedium:
width *= 2;
break;
case tbwThick:
width *= 3;
break;
default:
break;
}
Правильный вариант смотрите выше.