Являются ли множественные специализации шаблонов классов действительными, когда каждый отличается только между шаблонами, включающими параметры шаблона в невыводимых контекстах?
Обычный пример std::void_t использует его для определения признака, который показывает, имеет ли тип член typedef, называемый "type". Здесь используется одна специализация. Это можно было бы расширить, чтобы определить, имеет ли тип либо член typedef, называемый "type1", либо один, называемый "type2". Код С++ 1z ниже компилируется с помощью GCC, но не Clang. Является ли это законным?
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 {};