Являются ли множественные специализации шаблонов классов действительными, когда каждый отличается только между шаблонами, включающими параметры шаблона в невыводимых контекстах?
Обычный пример 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 {};