Les bases de std::expected
Retourner des valeurs ou des erreurs
Les bases de std::expected est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Valeurs ou erreurs
std::expected<T, E> (C++23) contient soit une valeur réussie de type T, soit une erreur de type E. Contrairement à un objet optionnel, il indique pourquoi l’opération a échoué. Incluez <expected>.
Retourner une réussite
En cas de réussite, vous retournez directement la valeur ; elle est stockée comme le type « attendu » 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";
}Retourner une erreur
Enveloppez l’erreur dans std::unexpected(...) pour signaler l’échec tout en retournant le même 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";
}Vérifier la réussite
Vérifiez le résultat dans un contexte booléen ou avec has_value(). Vrai signifie qu’il contient la valeur, faux signifie qu’il contient l’erreur.
#include <expected>
#include <iostream>
int main() {
std::expected<int, int> r = 5;
std::cout << r.has_value() << "\n"; // 1
}Lire la valeur
Utilisez *r ou r.value() pour lire la valeur en cas de réussite. value() lève une exception std::bad_expected_access s’il contient effectivement une erreur.
#include <expected>
#include <iostream>
int main() {
std::expected<int, std::string> r = 7;
if (r) std::cout << r.value() << "\n";
}Lire l’erreur
Lorsque le résultat est dans l’état d’erreur, r.error() vous donne l’objet d’erreur.
#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";
}Valeur de repli avec value_or
Comme pour un objet optionnel, value_or(fallback) renvoie la valeur en cas de réussite ou une valeur par défaut sans examiner l’erreur.
#include <expected>
#include <iostream>
std::expected<int, std::string> f() { return std::unexpected("x"); }
int main() {
std::cout << f().value_or(0) << "\n"; // 0
}Optionnel ou attendu
std::optional signifie « une valeur ou rien » ; std::expected signifie « une valeur ou une erreur décrite ». Choisissez expected lorsque les appelants doivent connaître la raison de l'échec.
Types d'erreur riches
Le type d'erreur E peut être une énumération, une structure ou une chaîne de message, selon ce qui décrit le mieux les échecs dans votre domaine.
#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";
}Aucune exception nécessaire
std::expected vous permet de propager les échecs sous forme de valeurs de retour ordinaires, ce qui est utile lorsque les exceptions sont désactivées ou coûteuses.
Note sur la disponibilité
std::expected est une fonctionnalité de C++23 ; vérifiez que votre compilateur et votre option de norme, par exemple -std=c++23, la prennent en charge avant de l'utiliser.
Vérification rapide
Vérifiez votre compréhension de std::expected.
Récapitulatif
Vous avez appris std::expected :
- Contient soit une valeur (
T), soit une erreur (E). - Retourne directement la réussite et les erreurs via
std::unexpected. - Se lit avec
*/value()eterror(). - Transporte la raison de l'échec, contrairement à l'optionnel.
Questions Fréquemment Posées
La leçon « Les bases de std::expected » est-elle gratuite ?
Oui — le texte complet de « Les bases de std::expected » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Les bases de std::expected » ?
Retourner des valeurs ou des erreurs Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Les bases de std::expected » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Représenter l’absence avec optional
- Accéder aux valeurs d’optional
- Les bases de std::expected
- Schémas de gestion des erreurs