Давайте возьмем пример из этого вопроса SO и удалим void_t
Код: Выделить всё
template< class , class = void >
struct has_member : std::false_type
{ };
// specialized as has_member< T , void > or discarded (SFINAE)
template< class T >
struct has_member< T , decltype( T::member ) > : std::true_type
{ };
Почему такое мышление ошибочно? Я думаю, это как-то связано со вторым параметром основного шаблона, имеющим значение по умолчанию («class = void»). Но я не понимаю, почему это имеет значение. Почему специализация должна использовать «void_t», чтобы соответствовать этому параметру по умолчанию? Разве весь смысл по умолчанию не в том, что их можно обойти? Где я могу прочитать больше об этой теме cppreference.com?
Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-sfinae