static_assert
     
     declaration
     
      (since C++11)
     
    
    Effectue une vérification d'assertion à la compilation.
         Table des matières | 
       
Syntaxe
         
          
           static_assert(
          
         
         
          bool-constexpr
         
         
          
           ,
          
         
         
          unevaluated-string
         
         
          
           )
          
         
         | 
        (1) | ||||||||
         
          
           static_assert(
          
         
         
          bool-constexpr
         
         
          
           )
          
         
         | 
        (2) | (depuis C++17) | |||||||
         
          
           static_assert(
          
         
         
          bool-constexpr
         
         
          
           ,
          
         
         
          constant-expression
         
         
          
           )
          
         
         | 
        (3) | (depuis C++26) | |||||||
Déclare une assertion statique. Si l'assertion échoue, le programme est mal formé et un message d'erreur de diagnostic peut être généré.
Explication
| bool-constexpr | - | 
         
  | 
       ||||
| unevaluated-string | - | un littéral de chaîne non évalué qui apparaîtra comme message d'erreur | ||||
| constant-expression | - | 
         une
         
          expression constante
         
         
          
           msg
          
         
         satisfaisant toutes les conditions suivantes :
         
  | 
       
Une déclaration static_assert peut apparaître au niveau de l'espace de noms et de la portée de bloc scope (en tant que déclaration de bloc ) et à l'intérieur d'un corps de classe (en tant que déclaration de membre ).
Si bool-constexpr est bien formé et évalue à true , ou est évalué dans le contexte d'une définition de template et que le template n'est pas instancié, cette déclaration n'a aucun effet. Sinon, une erreur de compilation est générée, et le message fourni par l'utilisateur, s'il existe, est inclus dans le message de diagnostic.
Le texte du message fourni par l'utilisateur est déterminé comme suit :
- Si le message correspond aux exigences syntaxiques de unevaluated-string , le texte du message est le texte de la unevaluated-string .
 
         
 
  | 
        (depuis C++26) | 
Notes
La norme n'exige pas qu'un compilateur imprime le texte littéral du message d'erreur , bien que les compilateurs le fassent généralement autant que possible.
| 
          Puisque le message d'erreur doit être un littéral de chaîne, il ne peut pas contenir d'informations dynamiques ni même une expression constante qui n'est pas elle-même un littéral de chaîne. En particulier, il ne peut pas contenir le nom de l' argument de type template .  | 
        (jusqu'à C++26) | 
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité | 
|---|---|---|---|
         
          
           __cpp_static_assert
          
         
         | 
        
         
          
           200410L
          
         
         | 
        (C++11) | static_assert (syntaxe ( 1 ) ) | 
         
          
           201411L
          
         
         | 
        (C++17) | static_assert à un seul argument (syntaxe ( 2 ) ) | |
         
          
           202306L
          
         
         | 
        (C++26) | Messages d'erreur générés par l'utilisateur (syntaxe ( 3 ) ) | 
Mots-clés
Exemple
#include <format> #include <type_traits> static_assert(03301 == 1729); // depuis C++17 la chaîne de message est optionnelle template<class T> void swap(T& a, T& b) noexcept { static_assert(std::is_copy_constructible_v<T>, "Swap requires copying"); static_assert(std::is_nothrow_copy_constructible_v<T> && std::is_nothrow_copy_assignable_v<T>, "Swap requires nothrow copy/assign"); auto c = b; b = a; a = c; } template<class T> struct data_structure { static_assert(std::is_default_constructible_v<T>, "Data structure requires default-constructible elements"); }; template<class> constexpr bool dependent_false = false; // contournement avant CWG2518/P2593R1 template<class T> struct bad_type { static_assert(dependent_false<T>, "error on instantiation, workaround"); static_assert(false, "error on instantiation"); // OK grâce à CWG2518/P2593R1 }; struct no_copy { no_copy(const no_copy&) = delete; no_copy() = default; }; struct no_default { no_default() = delete; }; #if __cpp_static_assert >= 202306L // Pas encore du vrai C++ (std::format devrait être constexpr pour fonctionner) : static_assert(sizeof(int) == 4, std::format("Expected 4, got {}", sizeof(int))); #endif int main() { int a, b; swap(a, b); no_copy nc_a, nc_b; swap(nc_a, nc_b); // 1 [[maybe_unused]] data_structure<int> ds_ok; [[maybe_unused]] data_structure<no_default> ds_error; // 2 }
Sortie possible :
1: erreur : assertion statique échouée : Swap requires copying 2: erreur : assertion statique échouée : Data structure requires default-constructible elements 3: erreur : assertion statique échouée : Expected 4, got 2
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé | 
|---|---|---|---|
| CWG 2039 | C++11 | seule l'expression avant conversion doit être constante | 
         la conversion doit également être
          valide dans une expression constante  | 
       
| 
         
          CWG 2518
         
          ( P2593R1 )  | 
        C++11 | static_assert ( false , "" ) ; non instancié était non conforme | rendu conforme | 
Références
- Norme C++23 (ISO/CEI 14882:2024) :
 
- 
         
- 9.1 Préambule [dcl.pre] (p. 10)
 
 
- Norme C++20 (ISO/CEI 14882:2020) :
 
- 
         
- 9.1 Préambule [dcl.pre] (p: 6)
 
 
- Norme C++17 (ISO/CEI 14882:2017) :
 
- 
         
- 10 Déclarations [dcl.dcl] (p: 6)
 
 
- Norme C++14 (ISO/CEI 14882:2014) :
 
- 
         
- 7 Déclarations [dcl.dcl] (p: 4)
 
 
- Norme C++11 (ISO/IEC 14882:2011) :
 
- 
         
- 7 Déclarations [dcl.dcl] (p: 4)
 
 
Voir aussi
| 
         affiche le message d'erreur donné et rend le programme non conforme
          (directive de préprocesseur)  | 
       |
| 
         interrompt le programme si la condition spécifiée par l'utilisateur n'est pas
         
          
           
            true
           
          
         
         . Peut être désactivé pour les versions de production.
          (macro fonction)  | 
       |
         
          
           contract_assert
          
          statement
         
         
          (C++26)
         
         | 
        vérifie une condition interne durant l'exécution | 
| 
          
           
            
             
              (C++11)
             
            
           
           
          | 
        
         supprime conditionnellement
         
          une surcharge de fonction ou une spécialisation de template
         
         de la résolution de surcharge
          (template de classe)  | 
       
| Type traits (C++11) | définit des interfaces basées sur des templates à la compilation pour interroger les propriétés des types | 
| 
          
          
           
            Documentation C
           
          
          pour
          
           
            Assertion statique
           
          
          
         | 
       |