L'asserzione statica viene utilizzata per fare asserzioni in fase di compilazione. Quando l'asserzione statica fallisce, il programma semplicemente non si compila. Ciò è utile in diverse situazioni, come, ad esempio, se si implementano alcune funzionalità tramite codice che dipendono in modo critico unsigned int
dall'oggetto che ha esattamente 32 bit. Puoi mettere un'affermazione statica come questa
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
nel codice. Su un'altra piattaforma, con un unsigned int
tipo di dimensioni diverse la compilazione fallirà, attirando così l'attenzione dello sviluppatore sulla parte problematica del codice e consigliandogli di reimplementarla o riesaminarla.
Per un altro esempio, potresti voler passare un valore integrale come void *
puntatore a una funzione (un trucco, ma a volte utile) e vuoi assicurarti che il valore integrale si adatti al puntatore
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
Potresti voler fare in modo che quel char
tipo sia firmato
static_assert(CHAR_MIN < 0);
o quella divisione integrale con valori negativi arrotonda verso zero
static_assert(-5 / 2 == -2);
E così via.
Le asserzioni in fase di esecuzione in molti casi possono essere utilizzate al posto delle asserzioni statiche, ma le asserzioni in fase di esecuzione funzionano solo in fase di esecuzione e solo quando il controllo passa sull'asserzione. Per questo motivo un'asserzione in fase di esecuzione non riuscita può rimanere inattiva, non rilevata per lunghi periodi di tempo.
Ovviamente, l'espressione nell'asserzione statica deve essere una costante del tempo di compilazione. Non può essere un valore di runtime. Per i valori di runtime non hai altra scelta che usare l'ordinario assert
.