Comme l'opérande d' sizeofopé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 fsi elle est utilisée sizeofuniquement. Cette technique est principalement utilisée dans la métaprogrammation de modèles C ++, car même en C ++, l'opérande de sizeofn'est pas évalué.
Pourquoi ça marche? Cela fonctionne parce que l' sizeofopé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 fsur 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: