Assertions statiques



Catégorie Macro static_assert( … ) Garantie Quand / Pourquoi vérifier cette propriété Scénario d’échec typique
Durée de vie / destruction std::is_nothrow_destructible_v<T> Le destructeur est déclaré noexcept → il ne peut pas lever d’exception. Les objets peuvent être détruits pendant le dépilement ou sur des threads de travail ; un destructeur qui lève une exception provoquerait un appel à std::terminate. Quelqu’un ajoute ~T() { if(err) throw; } ou un membre dont le destructeur peut lever une exception.
  std::is_trivially_destructible_v<T> Le compilateur ne fait rien dans le destructeur (destruction bit à bit). Nécessaire uniquement pour du code POD / sans verrou de très bas niveau (par ex. stockage dans std::atomic<T>). Ajout d’un std::vector, d’un pointeur intelligent ou d’un destructeur écrit par l’utilisateur.
Déplacement std::is_nothrow_move_constructible_v<T> Déplacer un T ne peut pas lever d’exception. Garantit que les conteneurs (std::vector, std::optional) conservent la garantie forte de sûreté vis-à-vis des exceptions et évitent les copies. Retrait de noexcept du constructeur par déplacement ou ajout d’un membre dont le déplacement peut lever une exception.
  std::is_nothrow_move_assignable_v<T> L’affectation par déplacement est noexcept. Mêmes raisons que ci-dessus ; accélère aussi les algorithmes qui reposent sur un swap rapide. Idem colonne précédente.
Protection contre la copie !std::is_copy_constructible_v<T> La construction par copie est supprimée. Les objets volumineux / uniques ne doivent jamais être copiés par accident (par ex. les tables de traduction). Un contributeur retire = delete, réactivant par accident des copies coûteuses.
  !std::is_copy_assignable_v<T> L’affectation par copie est supprimée. Comme ci-dessus. Idem.
Coût de copie / caractère POD std::is_trivially_copyable_v<T> L’objet peut être déplacé avec un simple memcpy (sans copie / déplacement / destructeur personnalisé). Petits types à sémantique de valeur passés par valeur à haute fréquence, données dans des files sans verrou. Ajout d’un pointeur intelligent ou d’opérations de copie / déplacement ou d’un destructeur écrits par l’utilisateur.
Permutabilité (C++17) std::is_nothrow_swappable_v<T> swap(a,b) est noexcept et peu coûteux. Permet aux algorithmes de la STL d’utiliser des chemins de permutation rapides (par ex. dans std::sort, std::map::insert). Un swap() personnalisé perd son noexcept, ou les opérations de déplacement se mettent à lever des exceptions.


Comment en appliquer une

#include <type_traits>
#include <utility>          // for std::is_nothrow_swappable_v

static_assert(std::is_nothrow_move_constructible_v<GTranslationTable>,
              "GTranslationTable move-ctor must be noexcept for vector reallocation!");

static_assert(!std::is_copy_constructible_v<GTranslationTable>,
              "Copying a translation table is disallowed — use move or shared_ptr.");


Choisir la bonne assertion

Intention Trait(s) suggéré(s)
Type à sémantique de valeur dont les performances sont critiques std::is_trivially_copyable_v<T>
Objet détenant une ressource que l’on déplace uniquement Supprimer les opérations de copie + vérifier par assertion les deux traits de déplacement sans exception
Objet partagé entre threads Au moins std::is_nothrow_destructible_v<T>
swap personnalisé / utilisé dans des tables associatives ordonnées Ajouter std::is_nothrow_swappable_v<T>