std::unreachable - безопасная стрельба в ногу 🔫
В C++23 стандартизировали метод std::unreachable, у которого лютое описание:
invokes undefined behavior.(До C++23 на linux можно использовать
__builtin_unreachable)Бывают случаи, когда совершенно точно известно, что значения аргумента в функции - ограниченное множество, но от нас все равно требуется что-то вернуть из функции при "недостижимых" значениях.
Пусть совершенно точно известно, что метод
magic_func принимает только значения 1 или 3:int magic_func(int value) {
switch (value) {
case 1:
return 100;
case 3:
return 500;
default:
/* ???????????? */
}
}
Нужно написать бесполезный код - что делать при значении не равном 1 или 3. Обычно делают два варианта:return 0; // возврат мусорного значенияЛишний код генерирует лишние инструкции - ссылка на godbolt.
throw std::exception(); // бросание мусорного исключения
Инструкция
unreachable никакой семантики не имеет, и нужна чтобы показать компилятору, что данный участок кода "недостижим". Компилятор может как-то оптимизировать этот участок кода.undefined behaviour значит, что в этом участке кода может происходить всё что захочет компилятор.В нашем случае, если написать
unreachable (ссылка на godbolt), компилятор выкинет лишнюю проверку и код станет таким:int magic_func(int value) {
if (value == 1) {
return 100;
}
return 500;
}