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