C++23 принёс
std::expected. Это не обёртка над optional — это принципиально другая семантика, которую важно понять сразу.✏️ Структурная разница
std::optional<T> // возвращает «значение или ничего»
std::expected<T,E> // возвращает «значение или причина отсутствия»
С его помощью можно вернуть код ошибки
expected<int, ErrorCode> parse(string s); // Пустой optional говорит «нет». Expected говорит «нет, потому что...»
❗️Под капотом
expected<T,E> — это discriminated union из T и E с флагом. Размер: max(sizeof(T), sizeof(E)) + 1 байт на флаг. Аналогично variant<T, unexpected<E>>.💡 Когда выбирать expected
Если caller должен знать причину —
expected. Если причина не важна — optional. Если ошибка аномальна и не должна обрабатываться в каждой точке — исключение. Это три разных инструмента для трёх разных ситуаций.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом