Como el operando del sizeof
operador 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 f
si 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 sizeof
no se evalúa.
¿Por qué funciona esto? Funciona porque el sizeof
operador 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 f
en 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
: