处理未实例化的模板函数

Tom*_*Tom 5 c++ compiler-bug template-function

以下代码在Visual C++ 2013中编译,但不在G ++ 4.8.2下编译:

template<class T>
int MyFunc(T& t)
{
    return static_cast<int>(CCodes::blah);
}

template<>
int MyFunc(float& t)
{
    return 0;
}

int main() {
    float f = 10.f;
    return MyFunc(f);
}
Run Code Online (Sandbox Code Playgroud)

Visual C++似乎忽略了通用模板函数,因为只MyFunc<float>使用了特化.无论如何,G ++解析了一般函数,并发现尚未定义CCodes枚举.

哪个是对的?或者是这个实现定义的?

Pot*_*ter 6

GCC是正确的,除了MSVC之外的所有其他编译器都会做同样的事情.

这是一个主要的错误,实际上出现在一个MSVC未来路线图上.它处于"遥远的未来"范畴.他们将不得不重写他们的模板引擎来修复它.

有一种说法认为,错误形成的模板的诊断是可选的,因为它实际上是一个没有格式良好的实例化的模板,并且不需要标记这些模板.然而,

  1. 该标准要求解析模板,无论实例化如何,都必须诊断解析失败.
  2. 每个其他编译器都进行诊断,因此实际上不这样做会导致MSVC用户生成不可移植的代码.抱怨是一个非常好的主意,即使它不是必需的.