tgoop.com/cxx95/58
Create:
Last Update:
Last Update:
#advice
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;
}