0Pricing
C++ Academy · Урок

Основы std::expected

Возвращайте значения или ошибки

«Основы std::expected» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Значения или ошибки

std::expected<T, E> (C++23) содержит либо успешное значение типа T, либо ошибку типа E. В отличие от optional, он сообщает причину неудачи. Подключите <expected>.

Возврат успешного результата

При успехе возвращайте значение напрямую: оно будет сохранено как значение «ожидаемого» типа T.

#include <expected>
#include <iostream>
std::expected<int, std::string> parse(bool ok) {
    if (ok) return 100;
    return std::unexpected("bad input");
}
int main() {
    auto r = parse(true);
    if (r) std::cout << *r << "\n";
}

Возврат ошибки

Оберните ошибку в std::unexpected(...), чтобы сообщить о неудаче и при этом сохранить тот же возвращаемый тип.

#include <expected>
#include <iostream>
#include <string>
std::expected<int, std::string> div(int a, int b) {
    if (b == 0) return std::unexpected("divide by zero");
    return a / b;
}
int main() {
    auto r = div(8, 0);
    if (!r) std::cout << r.error() << "\n";
}

Проверка успешного результата

Проверьте результат в логическом контексте или с помощью has_value(). Значение true означает, что результат содержит значение, а false — что он содержит ошибку.

#include <expected>
#include <iostream>
int main() {
    std::expected<int, int> r = 5;
    std::cout << r.has_value() << "\n"; // 1
}

Чтение значения

Используйте *r или r.value(), чтобы прочитать успешное значение. Если результат фактически содержит ошибку, value() выбрасывает std::bad_expected_access.

#include <expected>
#include <iostream>
int main() {
    std::expected<int, std::string> r = 7;
    if (r) std::cout << r.value() << "\n";
}

Чтение ошибки

Когда результат находится в состоянии ошибки, r.error() возвращает объект ошибки.

#include <expected>
#include <iostream>
#include <string>
std::expected<int, std::string> f() { return std::unexpected("nope"); }
int main() {
    auto r = f();
    if (!r) std::cout << "error: " << r.error() << "\n";
}

Резервное значение value_or

Как и optional, value_or(fallback) возвращает успешное значение или значение по умолчанию, не требуя проверки ошибки.

#include <expected>
#include <iostream>
std::expected<int, std::string> f() { return std::unexpected("x"); }
int main() {
    std::cout << f().value_or(0) << "\n"; // 0
}

Необязательное значение и ожидаемый результат

std::optional обозначает «значение или ничего»; std::expected — «значение или описание ошибки». Выбирайте ожидаемый результат, когда вызывающему коду нужно знать причину сбоя.

Богатые типы ошибок

Тип ошибки E может быть перечислением, структурой или строкой сообщения — используйте тот вариант, который лучше всего описывает сбои в вашей предметной области.

#include <expected>
#include <iostream>
enum class Err { NotFound, Denied };
std::expected<int, Err> get(bool ok) {
    if (ok) return 1;
    return std::unexpected(Err::Denied);
}
int main() {
    auto r = get(false);
    if (!r) std::cout << (int)r.error() << "\n";
}

Исключения не требуются

std::expected позволяет передавать сбои как обычные возвращаемые значения, что полезно там, где исключения отключены или слишком дороги.

Примечание о доступности

std::expected появился в C++23; перед использованием убедитесь, что Ваш компилятор и флаг стандарта, например -std=c++23, его поддерживают.

Быстрая проверка

Проверьте своё понимание std::expected.

Повторение

Вы узнали о std::expected:

  • Хранит либо значение (T), либо ошибку (E).
  • Успешный результат возвращается напрямую, а ошибки — через std::unexpected.
  • Значение можно получить с помощью */value(), а ошибку — с помощью error().
  • Содержит причину сбоя, в отличие от необязательного значения.

Часто задаваемые вопросы

Урок «Основы std::expected» бесплатный?

Да — полный текст урока «Основы std::expected» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основы std::expected»?

Возвращайте значения или ошибки Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Основы std::expected»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Представление отсутствия с optional
  2. Доступ к значениям optional
  3. Основы std::expected
  4. Шаблоны обработки ошибок
← Назад к C++ Academy