Como el operando del sizeofoperador no se evalúa, puede hacer esto:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
Demostración en línea: http://ideone.com/S8e2Y
Es decir, no necesita definir la función fsi solo se usa sizeof. Esta técnica se usa principalmente en la metaprogramación de plantillas de C ++, ya que incluso en C ++, el operando de sizeofno se evalúa.
¿Por qué funciona esto? Funciona porque el sizeofoperador no opera según el valor , sino que funciona según el tipo de expresión. Entonces, cuando escribe sizeof(f()), opera sobre el tipo de expresión f(), y que no es más que el tipo de retorno de la función f. El tipo de retorno es siempre el mismo, sin importar qué valor devolvería la función si realmente se ejecuta.
En C ++, puedes incluso esto:
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;
}
Sin embargo, parece que, en primer lugar sizeof, estoy creando una instancia de A, escribiendo A(), y luego llamando a la función fen la instancia, escribiendo A().f(), pero no sucede tal cosa.
Demostración: http://ideone.com/egPMi
Aquí hay otro tema que explica algunas otras propiedades interesantes de sizeof: