Ponieważ operand sizeof
operatora 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, f
jeśli jest używana sizeof
tylko 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ż sizeof
operator 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ę f
w 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
: