Почему трюк с SFINAE не работает для неклассового типа при попытке использовать указатель на член класса?

Из любопытства я пробовал альтернативную реализацию конструкции is_class , используя трюк sizeof () . Ниже приведен код:

template
struct is_class
{
  typedef char (&yes)[7];
  typedef char (&no)[3];

  static yes check (int T::*);
  static no check (...);

  enum { value = (sizeof(check(0)) == sizeof(yes)) };
};

Проблема в том, что когда я создаю экземпляр is_class , он дает ошибку компиляции:

error: creating pointer to member of non-class type ‘int’

Теперь мой вопрос, если int T :: * неприменимо для int (или void * и т. д.), тогда почему не ошибка замены для да, проверьте . Не следует ли компилятору выбирать без проверки ?

6
задан Community 23 May 2017 в 10:33
поделиться