Namespaces
Variants

static_assert declaration (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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é.

1) Une assertion statique avec un message d'erreur fixe.
2) Une assertion statique sans message d'erreur.
3) Une assertion statique avec un message d'erreur généré par l'utilisateur.
Cette syntaxe ne peut être utilisée que si la syntaxe ( 1 ) ne correspond pas.

Explication

bool-constexpr -

une expression constante contextuellement convertie de type bool . Les conversions intégrées ne sont pas autorisées, sauf pour les conversions intégrales non- restrictives vers bool .

(jusqu'en C++23)

une expression contextuellement convertie en bool où la conversion est une expression constante

(depuis C++23)
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 :
  • msg. size ( ) est implicitement convertible en std::size_t .
  • msg. data ( ) est implicitement convertible en const char * .

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 .
  • Sinon, étant données les valeurs suivantes :
Le texte du message est formé par la séquence de len unités de code , commençant à ptr , de l' encodage littéral ordinaire . Pour chaque entier i dans [ 0 , len ) , ptr [ i ] doit être une expression constante entière .
(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

static_assert

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