C++ Academy · Lektion

Grunderna i std::expected

Returnera värden eller fel

Lektion 3 av 413 steg

Grunderna i std::expected är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.

Värden eller fel

std::expected<T, E> (C++23) innehåller antingen ett lyckat värde av typen T eller ett fel av typen E. Till skillnad från optional innehåller den orsaken till att det misslyckades. Inkludera <expected>.

Returnera framgång

Vid framgång returnerar du värdet direkt; det lagras som den "förväntade" typen 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";
}

Returnera ett fel

Omslut felet i std::unexpected(...) för att signalera misslyckande samtidigt som du fortfarande returnerar samma 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";
}

Kontrollera framgång

Testa resultatet i ett booleskt sammanhang eller med has_value(). Sant betyder att det innehåller värdet, falskt betyder att det innehåller felet.

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

Läsa värdet

Använd *r eller r.value() för att läsa framgångsvärdet. value() kastar std::bad_expected_access om det faktiskt innehåller ett fel.

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

Läsa felet

När resultatet är i feltillståndet ger r.error() dig felobjektet.

#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 reservvärde

Precis som för optional returnerar value_or(fallback) framgångsvärdet eller ett standardvärde utan att undersöka felet.

#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 jämfört med expected

std::optional anger ”värde eller inget”; std::expected anger ”värde eller ett beskrivet fel”. Välj expected när anropande kod behöver känna till orsaken till misslyckandet.

Uttrycksfulla feltyper

Feltypen E kan vara en enum, en struct eller en meddelandesträng – det som bäst beskriver fel i er domän.

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

Inga undantag behövs

std::expected låter er vidarebefordra fel som vanliga returvärden, vilket är användbart där undantag är inaktiverade eller kostsamma.

Tillgänglighetsnotis

std::expected är en C++23-funktion. Kontrollera att kompilatorn och standardflaggan (till exempel -std=c++23) har stöd för den innan ni använder den.

Snabbtest

Kontrollera er förståelse av std::expected.

Sammanfattning

Ni har lärt er om std::expected:

  • Innehåller antingen ett värde (T) eller ett fel (E).
  • Returnerar lyckade resultat direkt och fel via std::unexpected.
  • Avläses med */value() och error().
  • Innehåller orsaken till misslyckandet, till skillnad från optional.
Gratis att börja

Lär dig C++ med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Grunderna i std::expected” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Grunderna i std::expected”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Grunderna i std::expected”?

Returnera värden eller fel Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C++ Academy?

Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Grunderna i std::expected”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C++ Academy-lektionen?

Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Representera frånvaro med optional
  2. Åtkomst till optional-värden
  3. Grunderna i std::expected
  4. Mönster för felhantering
← Tillbaka till C++ Academy