Grundlæggende om std::expected
Returnér værdier eller fejl
Grundlæggende om std::expected er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Værdier eller fejl
std::expected<T, E> (C++23) indeholder enten en vellykket værdi af typen T eller en fejl af typen E. I modsætning til optional indeholder den også årsagen til fejlen. Inkludér <expected>.
Returnering af succes
Ved succes returnerer du værdien direkte; den gemmes som typen T, der repræsenterer det forventede resultat.
#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";
}Returnering af en fejl
Pak fejlen ind i std::unexpected(...) for at signalere en fejl, mens du stadig returnerer samme type.
#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";
}Kontrol af succes
Kontrollér resultatet i en boolsk kontekst eller med has_value(). Sand betyder, at det indeholder værdien, og falsk betyder, at det indeholder fejlen.
#include <expected>
#include <iostream>
int main() {
std::expected<int, int> r = 5;
std::cout << r.has_value() << "\n"; // 1
}Læsning af værdien
Brug *r eller r.value() til at læse den vellykkede værdi. value() kaster std::bad_expected_access, hvis resultatet faktisk indeholder en fejl.
#include <expected>
#include <iostream>
int main() {
std::expected<int, std::string> r = 7;
if (r) std::cout << r.value() << "\n";
}Læsning af fejlen
Når resultatet er i fejltilstanden, giver r.error() dig fejlobjektet.
#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 som reserveværdi
Ligesom med optional returnerer value_or(fallback) den vellykkede værdi eller en standardværdi uden at undersøge fejlen.
#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 kontra Expected
std::optional siger "en værdi eller ingenting"; std::expected siger "en værdi eller en beskrevet fejl". Vælg expected, når kaldende kode skal kende årsagen til fejlen.
Beskrivende fejltyper
Fejltypen E kan være en enum, en struct eller en meddelelsesstreng – hvad der bedst beskriver fejlene i dit domæne.
#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";
}Ingen undtagelser nødvendige
std::expected lader dig videreføre fejl som almindelige returværdier, hvilket er nyttigt, når undtagelser er deaktiveret eller medfører store omkostninger.
Bemærkning om tilgængelighed
std::expected er en funktion i C++23. Sørg for, at din compiler og dit standardflag (for eksempel -std=c++23) understøtter det, før du bruger det.
Hurtigt tjek
Tjek din forståelse af std::expected.
Opsummering
Du har lært om std::expected:
- Indeholder enten en værdi (
T) eller en fejl (E). - Returnér succes direkte og fejl via
std::unexpected. - Læs værdien med
*/value()og fejlen mederror(). - Indeholder årsagen til fejlen i modsætning til optional.
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Grundlæggende om std::expected” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Grundlæggende om std::expected”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Grundlæggende om std::expected”?
Returnér værdier eller fejl Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Grundlæggende om std::expected”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Repræsentation af fravær med optional
- Adgang til optional-værdier
- Grundlæggende om std::expected
- Mønstre til fejlhåndtering