Poiché l'operando sizeof
dell'operatore non viene valutato, è possibile eseguire questa operazione:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
Demo online: http://ideone.com/S8e2Y
Cioè, non è necessario definire la funzione f
se viene utilizzata sizeof
solo in. Questa tecnica viene utilizzata principalmente nella metaprogrammazione di modelli C ++, poiché anche in C ++ l'operando di sizeof
non viene valutato.
Perché funziona? Funziona perché l' sizeof
operatore non opera sul valore , ma sul tipo dell'espressione. Quindi quando scrivi sizeof(f())
, opera sul tipo dell'espressione f()
e che non è altro che il tipo restituito della funzione f
. Il tipo restituito è sempre lo stesso, indipendentemente dal valore che la funzione restituirebbe se fosse effettivamente eseguita.
In C ++, puoi anche questo:
struct A
{
A(); //no definition, which means we cannot create instance!
int f(); //no definition, which means we cannot call it
};
int main() {
std::cout << sizeof(A().f())<< std::endl;
return 0;
}
Eppure sembra che, in primo luogo sizeof
, sto creando un'istanza di A
, scrivendo A()
, e quindi chiamando la funzione f
sull'istanza, scrivendo A().f()
, ma non succede nulla del genere.
Demo: http://ideone.com/egPMi
Ecco un altro argomento che spiega alcune altre proprietà interessanti di sizeof
: