Основы 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 — локальная установка не требуется.
Все уроки этого курса
- Представление отсутствия с optional
- Доступ к значениям optional
- Основы std::expected
- Шаблоны обработки ошибок