
std::expected в C++23: гайд по миграции с исключений на функциональный error handling
badcasedaily1 6 минут назад std::expected в C++23: гайд по миграции с исключений на функциональный error handling Средний 12 мин 50 Блог компании OTUS C++ * Программирование * Высоконагруженные системы * Туториал...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: badcasedaily1 6 минут назад std::expected в C++23: гайд по миграции с исключений на функциональный error handling Средний 12 мин 50 Блог компании OTUS C++ * Программирование * Высоконагруженные системы * Туториал Привет, Хабр! C++23 принёс в стандартную библиотеку std::expected — тип, который для языков семейства Rust и Haskell давно норма, а для C++ долгое время оставался экзотикой через сторонние библиотеки (tl::expected, boost::outcome). К середине 2026 года поддержка std::expected есть в GCC 12+, Clang 16+, MSVC 19.
33+, а компании постепенно начинают использовать его как замену исключениям в новых модулях. В статье рассмотрим, как мигрировать с привычного try/catch на std::expected, какие выигрыши даёт переход и где не стоит переходить из принципа. Зачем вообще нужен ещё один способ обработки ошибокВ C++ исторически три способа сообщить об ошибке.
Технические детали
Возврат специального значения (-1, nullptr, false), что работает в C, но плохо ложится на современные API. Исключения через throw/catch, которые есть в языке с C++98. Возврат std::optional, который говорит «значения нет», но не объясняет, почему.
У каждого подхода свои проблемы. Возврат специального значения требует помнить, какое именно значение означает ошибку для каждой функции, и легко проигнорировать проверку. Исключения дороги по производительности на throw‑path, требуют exception‑safe‑кода во всей цепочке вызовов, плохо взаимодействуют с многопоточностью и часто запрещены в game dev, embedded, real‑time системах.
std::optional теряет причину ошибки. std::expected — это контейнер, который содержит либо значение типа T (успех), либо значение типа E (ошибка). На уровне реализации это std::variant с удобным API и семантикой «либо успех, либо ошибка, третьего не дано».
Отраслевые последствия
Тип ошибки выбирает программист: enum, struct с деталями, std::string с описанием. #include #include #include enum class ; std::expected parse_positive_int(const std::string& input) { if (input. empty()) { return std::unexpected(ParseError::EmptyInput); } try { int value = std::stoi(input); if (value < 0) { return std::unexpected(ParseError::OutOfRange); } return value; } catch (...
) { return std::unexpected(ParseError::InvalidFormat); } } int main() { auto result = parse_positive_int("42 if (result) { std::cout << "Parsed: " << *result << '\n'; } }Несколько вещей сразу видны из этого примера. Функция явно объявляет, что может вернуть ошибку и какого типа. Возврат успеха выглядит как обычный return значения.
Возврат ошибки оборачивается в std::unexpected. На вызывающей стороне используется булевое преобразование if (result) для проверки, оператор * для доступа к значению, . error() для доступа к ошибке.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





