#include <type_traits>
template <typename T>
struct C;
template<typename T1, typename T2>
using first = T1;
template <typename T>
struct C<first<T, std::enable_if_t<std::is_same<T, int>::value>>>
{
};
int main ()
{
}
Результаты компиляции разными компиляторами:
MSVC:
ошибка C2753: 'C': частичная специализация не может соответствовать списку аргументов для первичного шаблона
НКУ-4,9:
ошибка: частичная специализация "C" не специализируется на аргументах шаблона
clang все версии:
ошибка: частичная специализация шаблона шаблона не специализируется ни на одном аргументе шаблона; для определения первичного шаблона, удалите список аргументов шаблона
GCC-5 +: успешно компилирует
И еще я хочу отметить, что тривиальная специализация вроде:
template<typename T>
struct C<T>
{
};
успешно не скомпилируется gcc. Похоже, он выясняет, что специализация в моем первоначальном примере нетривиальна. Поэтому мой вопрос - это шаблон, подобный этому, явно запрещенный стандартом С++ или не?