是编译这段代码的标准行为吗?

时间:2012-08-12 00:30:39

标签: c++ templates

请考虑以下代码:

struct Undefined;

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

int main()
{
  return 0;
}

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

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

  

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

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

1 个答案:

答案 0 :(得分:7)

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

之内
  

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

即模板格式错误虽然编译器不需要诊断它。