Вопрос

ссылаясь на вчерашний пост, это разбудило меня сегодня утром.Почему это на самом деле работает?До тех пор, пока функция test обеспокоен тем, что у этой функции нет тела, так как же она может что-либо выполнять?Я хочу знать, почему и как это работает?Мне ДЕЙСТВИТЕЛЬНО интересно увидеть ваши ответы.

template<typename T> 
class IsClassT { 
  private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(int C::*); //NO BODY HERE
    template<typename C> static Two test(…); //NOR HERE
  public: 
    enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) }; 
    enum { No = !Yes }; 
}; 

Заранее благодарю за помощь в понимании этого очень интересного явления.

Это было полезно?

Решение

Я предполагаю, что вы имеете в виду перечисление Да? IsClassT<T>::test<T>(0)?sizeof фактически не оценивает свои аргументы.Вот почему код, подобный следующему, является законным, даже если вы ожидаете, что он вас выручит:

int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(

Другие советы

  1. Вы не можете получить ошибку компилятора, потому что test-функция декларация существует.

  2. Вы не можете получить ошибку компоновщика, потому что вы не звоните test-функция.

Стандарт C ++ ISO/IEC 14882: 2003 (E)

5.3.3 Размер

Оператор sizeof выдает количество байтов в объектном представлении его операнда.Операндом является либо выражение, которое не оценивается, или заключенный в скобки идентификатор типа.Оператор sizeof не должен ...

...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top