Я нашел этот кусок фиктивного кода (надуманный пример ниже):
template <int I, typename T>
struct foo
{
static int bar()
{
return 1;
}
};
template <std::size_t Index, typename T>
struct foo<Index, T*>
{
static int bar()
{
return 2;
}
};
Обратите внимание, что специализация использует другой тип (по ошибке). Удивительно, что он компилируется без каких-либо ошибок (или предупреждений) как с GCC 4.8.1, так и с Clang 3.4. Но что еще более странно для линии GCC foo<0, int*>::bar()
приводит к 1
, но Clang дает 2
. Что происходит? Он по-прежнему считается специализацией по стандарту?