6

以下代码在 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);
}

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

哪个是对的?还是这个实现定义的?

4

1 回答 1

7

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

这是一个重大错误,实际上出现在一个 MSVC 未来路线图上。它属于“遥远的未来”类别。他们将不得不重写他们的模板引擎来修复它。

有一个论点认为,对格式错误的模板进行诊断是可选的,因为它实际上是一个没有格式正确的实例化的模板,并且不需要标记这些模板。然而,

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