0Pricing
C++ Academy · Leçon

Spécificateur noexcept

Marquer les fonctions qui ne lèvent pas d’exception

Spécificateur noexcept 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.

Ce que déclare noexcept

Le spécificateur noexcept garantit qu’une fonction ne lèvera pas d’exception. Si elle le fait malgré tout, le programme appelle std::terminate.

#include <iostream>

int square(int x) noexcept {
    return x * x;
}

int main() {
    std::cout << square(5) << "\n";
}

Pourquoi c’est important

Savoir qu’une fonction ne peut pas lever d’exception permet au compilateur et à la bibliothèque d’optimiser le code, par exemple en choisissant les déplacements plutôt que les copies lors de l’agrandissement d’un conteneur.

Les opérations de déplacement doivent être noexcept

std::vector n’utilise votre constructeur de déplacement lors d’une réallocation que s’il est noexcept ; sinon, il effectue une copie par sécurité. Marquez donc les déplacements noexcept.

struct Buffer {
    int* p;
    Buffer(Buffer&& o) noexcept : p(o.p) { o.p = nullptr; }
};

Les destructeurs sont noexcept par défaut

Depuis C++11, les destructeurs sont implicitement noexcept. Laisser une exception s’en échapper termine le programme.

noexcept conditionnel

noexcept(expr) fait dépendre la garantie d’un booléen évalué à la compilation, ce qui est utile dans les modèles qui transmettent la garantie d’un autre type.

template <class T>
void swapValues(T& a, T& b) noexcept(noexcept(T(std::move(a)))) {
    T tmp = std::move(a);
    a = std::move(b);
    b = std::move(tmp);
}

Interroger avec l’opérateur noexcept

Utilisé comme opérateur, noexcept(expr) produit true si l’expression est déclarée comme ne levant pas d’exception, ce qui est pratique dans les modèles.

#include <iostream>

int f() noexcept { return 1; }
int g() { return 2; }

int main() {
    std::cout << noexcept(f()) << " " << noexcept(g()) << "\n";  // 1 0
}

noexcept fait partie du type

Depuis C++17, noexcept fait partie du type d’un pointeur de fonction ; une fonction susceptible de lever une exception ne peut donc pas être liée à un pointeur noexcept.

Ne pas faire de promesses excessives

Ne marquez une fonction noexcept que si vous êtes certain qu’elle ne peut pas lever d’exception. Une promesse erronée qui est violée fait planter tout le programme.

Candidats Good

Les échanges, les déplacements, les destructeurs, les accesseurs simples et les utilitaires arithmétiques sont naturellement des fonctions noexcept.

noexcept ou throw()

L’ancienne spécification dynamique throw() est obsolète et a été supprimée. Utilisez plutôt noexcept en C++ moderne.

Performances et sûreté

noexcept documente l’intention tout en permettant des optimisations comme le déplacement lors d’une réallocation : une petite annotation aux effets réels.

Vérification rapide

Vérifiez votre compréhension de noexcept.

Récapitulatif

Vous avez appris que le spécificateur noexcept promet l’absence d’exceptions et permet des optimisations comme le déplacement lors d’une réallocation. Marquez les déplacements, les échanges et les destructeurs noexcept, utilisez les formes conditionnelles dans les modèles et ne faites jamais de promesses excessives.

Questions Fréquemment Posées

La leçon « Spécificateur noexcept » est-elle gratuite ?

Oui — le texte complet de « Spécificateur noexcept » 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 « Spécificateur noexcept » ?

Marquer les fonctions qui ne lèvent pas d’exception 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 « Spécificateur noexcept » ?

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. try, catch, throw
  2. Sûreté vis-à-vis des exceptions
  3. Spécificateur noexcept
  4. Types d’exceptions personnalisés
← Retour à C++ Academy