Здравствуйте, sergii.p, Вы писали:
P>какой unreachable? До него уже столько кода написано 
Помнится, когда вводили область видимости для переменных, объявленных в заголовке for (С++ 98), тоже стоны были, мол, столько кода написано, где переменная используется после цикла. А ничего, код починили (и я свой код в том числе), и он стал лучше почти всегда. При этом, случаев, где переменная цикла была переиспользована для следующего цикла или для других целей было точно сильно больше, чем кода, где есть ветки без return.
Вот так же нужно починить код, где был возможен провал в ветки без явного возврата.
P> Кстати это такой же костыль наподобие "мамой клянусь" который вы критиковали. Если мы на него нарвёмся получим тот же UB. И в чём цимес? В том что прокомментировали более явно свои намерения? Ну ок, в принципе тоже аргумент.
Именно. Когда компилятор увидит std::undefined, то он будет "знать", что программист не забыл возврат, а именно гарантирует письменным заявлением, что в эту ветку мы не попадём, и берёт всю ответственность на себя, текстом через код.
Более того, когда я буду делать ревью пулл-реквеста, пойму то же самое. Когда я загляну в код через год-два-десять,то не буду не угадывать ход мыслей автора, а буду видеть его выраженным в написанном контракте. Исходный код — это не только предусловие к генерации кода машинного, но и способ выразить мысль.
_>> Ну или приведите пример, где получим, не гипотетически, а на практике, у меня не получилось, может плохо старался.
SP>я считал очевидным вернуть Type::unknown.
<cut>
Но это же не соответствует модели мысли автора кода. Автор подразумевал, что 3 невозможно, просто в коде это не было выражено. std::unreachable/abort выразит эту мысль явно... Да, старый поломанный код придётся явно и одномоментно починить и это может быть неприятным, но см. пример с for. При использовании std::unreachable сгенерированный код не становится хуже относительно изначального.
Возврат Type::unknown нужно делать, если таки есть сомнения в невозможности 3, и тут уж рост бинарного кода никакого значения не имеет. Вы же не будете писать код без этой ветки, понимая, что 3 таки может прилететь, даже понимая, что добавление обработки неожиданной тройки приведёт к росту бинаря?
Т.е. автору (ну или мейнтейнеру, если не повезло такой код поддерживать) придётся, под давлением компилятора, явно выбрать, что во что мы верим: или таки в то, что в ветку без return мы не попадём, или всё-таки что при неудобных обстоятельствах попадём и нужно решить, какого поведения мы хотим в таком случае.