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()orazerror(). - 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
- Reprezentowanie braku wartości za pomocą optional
- Dostęp do wartości optional
- Podstawy std::expected
- Wzorce obsługi błędów