Почему void_t используется в SFINAE?C++

Программы на C++. Форум разработчиков
Anonymous
 Почему void_t используется в SFINAE?

Сообщение Anonymous »

Я хочу, чтобы мой вопрос стал продолжением вопроса: Как мы используем void_t для SFINAE?. Я понимаю, как используется void_t. Я не понимаю, зачем это необходимо.
Давайте возьмем пример из этого вопроса 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

Вернуться в «C++»