Várias especializações de modelo de classe SFINAE usando void_t

As especializações de modelos de várias classes são válidas, quando cada uma é distinta apenas entre padrões que envolvem parâmetros de modelo em contextos não deduzidos?

Um exemplo comum destd::void_t usa-o para definir uma característica que revela se um tipo tem um membrotypedef chamado "tipo". Aqui, uma única especialização é empregada. Isso pode ser estendido para identificar, digamos, se um tipo temou um membrotypedef chamado "type1" ou um chamado "type2". O código C ++ 1z abaixo é compilado com o GCC, mas não com o Clang. Isso é legal?

template <class, class = std::void_t<>>
struct has_members : std::false_type {};

template <class T>                      
struct has_members<T, std::void_t<typename T::type1>> : std::true_type {};

template <class T>                                                        
struct has_members<T, std::void_t<typename T::type2>> : std::true_type {};

questionAnswers(2)

yourAnswerToTheQuestion