Я знаю, когда вы вводите std :: unreachable () в вашем коде вы гарантируете, что код никогда не достигнет этой точки, и если он это сделает, это UB (все идет). В сборках отладки я заметил, что есть исключение, которое приятно для обнаружения ошибок. Мой вопрос: давайте просто скажем, что мы переключаемся на сборку релиза, и у вас есть std :: unreachable () в вашем коде, как: < /p>
Код: Выделить всё
switch(x)
{
case 1: return 1;
case 2: return 2;
default: std::unreachable();
}
< /code>
Затем, когда вы запускаете в режиме выпуска, если он достигает этой точки, то это UB, но если это не так, нет способа выяснить, что пошло не так, верно? Я имею в виду, я не могу сделать: < /p>
default: /* LOG MY ERROR */; std::unreachable();
< /code>
или: < /p>
default: /* LOG MY ERROR AND TERMINATE */; std::unreachable();
Потому что я гарантировал компилятору, что весь код после случая по умолчанию не может быть достигнут, и там это UB (журнал или излучение сообщения, которое я имею в виду)? Я не могу сделать оба? Так что, если он достигнет «точки», войдите в систему ошибки и прекращайте, но все же иметь преимущества оптимизации, сказав компилятору, что это никогда не должно быть достигнуто?
Подробнее здесь:
https://stackoverflow.com/questions/796 ... ase-builds