6

考虑以下代码:

struct Undefined;

template <typename T>
void TemplateFunction()
{
  Undefined obj;
}

int main()
{
  return 0;
}

我一直认为模板函数和模板方法(或模板类的方法部分)只会检查语法(除非它们被实例化),在这种情况下上面的代码应该编译。

问题是,它不能用 Xcode(版本:4.3.2,使用 LLVM 编译器)编译,现在我想知道上面的代码是否是非标准的,即它不应该符合 C++03 标准的编译器上编译? Xcode的错误是:

变量的类型不完整“未定义”

请注意,在原始代码中,未定义对象是静态断言的一部分。

4

1 回答 1

7

编译器拒绝代码是正确的,即使其他编译器会很乐意接受它。特别是报价将在 §14.6[temp.res]/8 内

[...] 如果无法为模板定义生成有效的特化,并且该模板未实例化,则模板定义格式错误,无需诊断。[...]如果在非依赖名称中使用的类型在定义模板时不完整,但在实例化完成时是完整的,并且该类型的完整性是否会影响程序格式正确或影响程序的语义,程序格式错误;[...]

也就是说,尽管不需要编译器来诊断模板,但模板格式错误。

于 2012-08-12T00:46:58.547 回答