我发现了这段伪造的代码(下面是人为的例子):
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
。到底是怎么回事?它仍然被标准视为专业化吗?