Оскільки операнд 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
: