Comme l'opérande d' sizeof
opérateur n'est pas évalué, vous pouvez le faire:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
Démo en ligne: http://ideone.com/S8e2Y
Autrement dit, vous n'avez pas besoin de définir la fonction f
si elle est utilisée sizeof
uniquement. Cette technique est principalement utilisée dans la métaprogrammation de modèles C ++, car même en C ++, l'opérande de sizeof
n'est pas évalué.
Pourquoi ça marche? Cela fonctionne parce que l' sizeof
opérateur n'opère pas sur la valeur , mais opère sur le type de l'expression. Ainsi, lorsque vous écrivez sizeof(f())
, il opère sur le type de l'expression f()
, et qui n'est rien d'autre que le type de retour de la fonction f
. Le type de retour est toujours le même, quelle que soit la valeur que la fonction retournerait si elle s'exécute réellement.
En C ++, vous pouvez même ceci:
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;
}
Pourtant, il semble que, dans sizeof
, je crée d'abord une instance de A
, en écrivant A()
, puis j'appelle la fonction f
sur l'instance, en écrivant A().f()
, mais rien de tel ne se produit.
Démo: http://ideone.com/egPMi
Voici un autre sujet qui explique quelques autres propriétés intéressantes de sizeof
: