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