Ponieważ operand sizeofoperatora nie jest oceniany, możesz to zrobić:
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
Oznacza to, że nie musisz definiować funkcji, fjeśli jest używana sizeoftylko w. Ta technika jest najczęściej używana w metaprogramowaniu szablonów C ++, podobnie jak w C ++, operandziesizeof nie jest oceniany.
Dlaczego to działa? Działa, ponieważ sizeofoperator nie działa na wartości , zamiast tego działa na typie wyrażenia. Więc kiedy piszesz sizeof(f()), działa na typie wyrażenia f(), które jest niczym innym jak zwróconym typem funkcji f. Typ zwracany jest zawsze taki sam, bez względu na wartość, jaką zwróciłaby funkcja, gdyby faktycznie się wykonała.
W C ++ możesz nawet to:
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;
}
Wygląda jednak na to sizeof, że najpierw tworzę instancję A, pisząc A(), a następnie wywołując funkcję fw instancji, pisząc A().f(), ale nic takiego się nie dzieje.
Demo: http://ideone.com/egPMi
Oto kolejny temat, który wyjaśnia kilka innych interesujących właściwości sizeof: