Perché viene compilato questo codice?
_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, "");
I primi 2 assertori sono ovviamente corretti, ma mi sarei aspettato che l'ultima riga fallisse, poiché la mia comprensione è che sizeof()
dovrebbe valutare un valore intero letterale, che non può essere trattato come un array. In altre parole, fallirebbe nello stesso modo in cui fallisce la seguente riga:
_Static_assert(4[0] == 4, "");
È interessante notare che il seguente non riesce a compilare (che dovrebbe fare la stessa cosa, no?):
_Static_assert(*sizeof(my_arr) == 4, "");
errore: argomento di tipo non valido di unario '*' (avere 'long unsigned int') _Static_assert (* sizeof (my_arr) == 4, "");
Se è importante, sto usando gcc 5.3.0
( sizeof( my_arr ) )[ 0 ]
fallisca.