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

Sam*_*rsa 6 c++ templates

请考虑以下代码:

struct Undefined;

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

int main()
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

变量具有不完整类型"未定义"

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

Dav*_*eas 7

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

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

也就是说,虽然编译器不需要诊断它,但模板格式不正确.

  • @Nya:是的,这个节目是*格式错误*,所以clang正确拒绝它.但是不需要诊断,所以gcc忽略了这个问题.这并不意味着程序是正确的,只是gcc没有诊断错误.在某种程度上,这将等同于编译时*未定义的行为*.它似乎*工作*虽然它是不正确的.请注意,在许多情况下,编译器不需要诊断,例如,"内联"模板的两个不同定义违反了ODR,但编译器不需要诊断(并且大多数都不需要) (3认同)