Por que esse código é compilado?
_Static uint32_t my_arr[2];
_Static_assert(sizeof(my_arr) == 8, "");
_Static_assert(sizeof(my_arr[0]) == 4, "");
_Static_assert(sizeof(my_arr)[0] == 4, "");
As duas primeiras afirmações estão obviamente corretas, mas eu esperava que a última linha falhasse, pois meu entendimento é que isso sizeof()
deve ser avaliado como um literal inteiro, que não pode ser tratado como uma matriz. Em outras palavras, falharia da mesma maneira que a seguinte linha falha:
_Static_assert(4[0] == 4, "");
Curiosamente, o seguinte não compila (o que deveria estar fazendo a mesma coisa, não?):
_Static_assert(*sizeof(my_arr) == 4, "");
erro: argumento de tipo inválido de unary '*' (tem 'long unsigned int') _Static_assert (* sizeof (my_arr) == 4, "");
Se isso importa, estou usando o gcc 5.3.0
( sizeof( my_arr ) )[ 0 ]
falha.