0Pricing
C++ Academy · Lekcja

Podstawy std::expected

Zwracaj wartości lub błędy

Podstawy std::expected to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Wartości albo błędy

std::expected<T, E> (C++23) przechowuje albo pomyślną wartość typu T, albo błąd typu E. W przeciwieństwie do optionala zawiera informację, dlaczego operacja się nie powiodła. Należy dołączyć <expected>.

Zwracanie powodzenia

W przypadku powodzenia zwracasz wartość bezpośrednio; jest ona przechowywana jako typ „expected”, czyli 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";
}

Zwracanie błędu

Owiń błąd w std::unexpected(...), aby zasygnalizować niepowodzenie, nadal zwracając ten sam typ.

#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";
}

Sprawdzanie powodzenia

Sprawdź wynik w kontekście logicznym albo za pomocą has_value(). Wartość true oznacza, że przechowuje on wartość, a false — że przechowuje błąd.

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

Odczytywanie wartości

Użyj *r lub r.value(), aby odczytać wartość oznaczającą powodzenie. value() zgłasza wyjątek std::bad_expected_access, jeśli obiekt faktycznie przechowuje błąd.

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

Odczytywanie błędu

Gdy wynik jest w stanie błędu, r.error() udostępnia obiekt błędu.

#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";
}

Wartość zastępcza value_or

Podobnie jak w przypadku optionala, value_or(fallback) zwraca wartość oznaczającą powodzenie albo wartość domyślną, bez sprawdzania błędu.

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

Optional a Expected

std::optional oznacza „wartość albo nic”, natomiast std::expected — „wartość albo opisany błąd”. Proszę wybrać expected, gdy kod wywołujący musi znać przyczynę niepowodzenia.

Rozbudowane typy błędów

Typ błędu E może być wyliczeniem, strukturą albo ciągiem znaków z komunikatem — należy wybrać rozwiązanie, które najlepiej opisuje niepowodzenia w danej domenie.

#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";
}

Wyjątki nie są potrzebne

std::expected umożliwia propagowanie niepowodzeń jako zwykłych wartości zwracanych, co jest przydatne tam, gdzie wyjątki są wyłączone lub kosztowne.

Informacja o dostępności

std::expected jest funkcją języka C++23. Przed użyciem należy upewnić się, że kompilator i flaga standardu, na przykład -std=c++23, obsługują tę funkcję.

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat std::expected.

Podsumowanie

Poznałeś(-aś) std::expected:

  • Przechowuje wartość (T) albo błąd (E).
  • Sukces zwraca bezpośrednio, a błędy za pomocą std::unexpected.
  • Odczyt umożliwiają */value() oraz error().
  • Przechowuje przyczynę niepowodzenia, w przeciwieństwie do optional.

Często zadawane pytania

Czy lekcja „Podstawy std::expected” jest bezpłatna?

Tak — pełny tekst „Podstawy std::expected” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Podstawy std::expected”?

Zwracaj wartości lub błędy Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Podstawy std::expected”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Reprezentowanie braku wartości za pomocą optional
  2. Dostęp do wartości optional
  3. Podstawy std::expected
  4. Wzorce obsługi błędów
← Powrót do C++ Academy