Работа OnInquire, CPL_DYNAMIC_RES и OnNewInquire

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

0
задан Kai Neugebauer 18 March 2019 в 12:12
поделиться