Assert estático é usado para fazer asserções em tempo de compilação. Quando a asserção estática falha, o programa simplesmente não compila. Isso é útil em diferentes situações, como, por exemplo, se você implementar alguma funcionalidade por código que depende criticamente de um unsigned int
objeto ter exatamente 32 bits. Você pode colocar uma declaração estática como esta
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
em seu código. Em outra plataforma, com tipos de tamanhos diferentes, unsigned int
a compilação falhará, chamando a atenção do desenvolvedor para a parte problemática do código e aconselhando-os a reimplementar ou inspecionar novamente.
Para outro exemplo, você pode querer passar algum valor integral como um void *
ponteiro para uma função (um hack, mas útil às vezes) e você deseja ter certeza de que o valor integral caberá no ponteiro
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
Você pode querer um ativo que char
seja assinado
static_assert(CHAR_MIN < 0);
ou aquela divisão integral com valores negativos arredondados para zero
static_assert(-5 / 2 == -2);
E assim por diante.
Em muitos casos, as asserções de tempo de execução podem ser usadas em vez de asserções estáticas, mas as asserções de tempo de execução só funcionam em tempo de execução e somente quando o controle passa sobre a asserção. Por esse motivo, uma declaração de tempo de execução com falha pode permanecer inativa, sem ser detectada por longos períodos de tempo.
Obviamente, a expressão em asserção estática deve ser uma constante de tempo de compilação. Não pode ser um valor de tempo de execução. Para valores de tempo de execução, você não tem outra escolha a não ser usar o normal assert
.