L'assertion statique est utilisée pour faire des assertions au moment de la compilation. Lorsque l'assertion statique échoue, le programme ne se compile tout simplement pas. Ceci est utile dans différentes situations, comme, par exemple, si vous implémentez une fonctionnalité par code qui dépend de manière critique d'un unsigned int
objet ayant exactement 32 bits. Vous pouvez mettre une affirmation statique comme celle-ci
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
dans votre code. Sur une autre plate-forme, avec un unsigned int
type de taille différente, la compilation échouera, attirant ainsi l'attention du développeur sur la partie problématique du code et lui conseillant de le réimplémenter ou de le réinspecter.
Pour un autre exemple, vous voudrez peut-être passer une valeur intégrale en tant que void *
pointeur vers une fonction (un hack, mais parfois utile) et vous voulez vous assurer que la valeur intégrale tiendra dans le pointeur
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
Vous souhaiterez peut-être que l'élément dont le char
type est signé
static_assert(CHAR_MIN < 0);
ou cette division intégrale avec des valeurs négatives arrondit vers zéro
static_assert(-5 / 2 == -2);
Etc.
Dans de nombreux cas, les assertions d'exécution peuvent être utilisées à la place des assertions statiques, mais les assertions d'exécution ne fonctionnent qu'au moment de l'exécution et uniquement lorsque le contrôle passe sur l'assertion. Pour cette raison, une assertion d'exécution défaillante peut rester inactive, non détectée pendant de longues périodes.
Bien sûr, l'expression dans l'assertion statique doit être une constante au moment de la compilation. Il ne peut pas s'agir d'une valeur d'exécution. Pour les valeurs d'exécution, vous n'avez pas d'autre choix que d'utiliser l'ordinaire assert
.