C++ Academy · Lektion

Grundlæggende om std::expected

Returnér værdier eller fejl

Lektion 3 af 413 trin

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 med error().
  • Indeholder årsagen til fejlen i modsætning til optional.
Gratis at komme i gang

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

  1. Repræsentation af fravær med optional
  2. Adgang til optional-værdier
  3. Grundlæggende om std::expected
  4. Mønstre til fejlhåndtering
← Tilbage til C++ Academy