Почему это работает (Шаблоны, SFINAE). C++

обращаясь к вчерашнему сообщению, это разбудило меня этим утром. Почему это на самом деле работает? Пока функция 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 }; 
}; 

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

7
задан James McNellis 1 May 2010 в 15:38
поделиться

2 ответа

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

int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(
6
ответ дан 6 December 2019 в 15:20
поделиться
  1. Вы не можете получить ошибку компилятора, потому что test-функция declaration существует.

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

C++ Standart ISO/IEC 14882:2003(E)

5.3.3 Sizeof

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

...

8
ответ дан 6 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: