0Pricing
C++ Academy · Leçon

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() et error().
  • 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

  1. Représenter l’absence avec optional
  2. Accéder aux valeurs d’optional
  3. Les bases de std::expected
  4. Schémas de gestion des erreurs
← Retour à C++ Academy