Оскільки операнд sizeofоператора не оцінюється, ви можете зробити це:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
Демонстрація в Інтернеті: http://ideone.com/S8e2Y
Тобто вам не потрібно визначати функцію, fякщо вона використовується sizeofлише. Цей прийом здебільшого застосовується в метапрограмуванні шаблонів на C ++, як навіть у C ++, операндіsizeof не оцінюється.
Чому це працює? Це працює тому, щоsizeof оператор не працює на значення , натомість працює на тип виразу. Отже, коли ви пишете sizeof(f()), він діє на тип виразу f(), і це не що інше, як тип повернення функціїf . Тип повернення завжди однаковий, незалежно від того, яке значення повернула б функція, якщо вона насправді виконується.
У програмі C ++ ви навіть можете це:
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;
}
І все-таки це схоже на те sizeof, що я спершу створюю екземпляр A, пишучи A(), а потім викликаю функцію fв екземплярі, пишучиA().f() , але нічого подібного не відбувається.
Демонстрація: http://ideone.com/egPMi
Ось ще одна тема, яка пояснює деякі інші цікаві властивості sizeof: