default. Если туда приходит значение, которого нет среди case, то вроде бы ничего страшного — пропустим switch, пойдём дальше выполняться.
Но что если тип, по которому делается switch, — enum, а то и enum class? И при этом, все валидные значения разобраны в case, а другое получилось из-за ошибки в другом месте?
Может ли компилятор считать, что невалидное значение enum'а — это UB, и скомпилировать такой switch, например, в таблицу прыжков без проверки на переполнение?
я могу сильно ошибаться, но enum / enum class не подразумевает ограничения на множество значений для underlying type, т.е. компилятор не имеет право считать, что значение ограничено enum-ом
Подобная оптимизация была в GCC и её быстро откатили, так как она ломала пользовательский код. Но есть другие оптимизации, которые позволяют преполагать, что switch содержит все возможные кейсы для энума и в этом случае оптимизация происходит https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82404
Обсуждают сегодня