具有类型转换的模板专业化

mag*_*gor 13 c++ gcc templates clang template-specialization

我发现了这段伪造的代码(下面的设计示例):

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,专业化使用不同的类型(错误).令人惊讶的是,它在没有GCC 4.8.1和Clang 3.4的任何错误(或警告)的情况下进行编译.但对于海湾合作委员会的foo<0, int*>::bar()结果来说更奇怪的是1,但是Clang给出了2.到底是怎么回事?是否仍然被标准视为专业化?

小智 2

Gcc 是错误的,因为你根本无法调用这个专业化。只需删除主模板定义:

template <int I, typename T>
struct foo;

template <std::size_t Index>
struct foo<Index, int*> {
  static int bar() {
    return 2;
  }
};

int main() {
  std::cout << foo<std::size_t(0), int*>::bar() << std::endl; // nope, not work
  std::cout << foo<0, int*>::bar() << std::endl; // nope, not work
}
Run Code Online (Sandbox Code Playgroud)

请参阅实例。并且代码必须报告不明确的部分专业化,但事实并非如此(对于 gcc)。Clang报告“模棱两可”。

PS 我认为标准没有充分涵盖这一部分。

更新

在这种情况下,clang 不适用于枚举例如