Разбираем, почему «магические значения» вроде
-
1 и пустые строки ломают контракт функций, чем
std::expected<T, E> принципиально отличается от
std::optional<T>, как возвращать ошибку через
std::unexpected, и как дисциплинированно обрабатывать результат через проверки
if (
has_value(),
value(),
error()). В примерах показываем парсинг чисел без исключений на базе
std::from_chars и «проброс» ошибок наверх в стиле CLI-приложения.