Всегда вставляйте метку 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;
}

Правильный вариант смотрите выше.