Grunderna i std::expected
Returnera värden eller fel
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()ocherror(). - Innehåller orsaken till misslyckandet, till skillnad från optional.
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
- Representera frånvaro med optional
- Åtkomst till optional-värden
- Grunderna i std::expected
- Mönster för felhantering