假设您有以下(格式错误的)程序:
struct A
{
A(int, int)
{
}
};
template <typename T>
class B
{
B()
{
if (sizeof (T) == 1)
{
throw A(0); // wrong, A() needs two arguments
}
}
};
int main()
{
return 0;
}
GCC编译此程序时没有任何错误,clang ++拒绝错误。
答案 0 :(得分:11)
模板在使用时被实例化。但是,它应该在定义时编译。您的代码A(0)
使用名称A
,该名称不依赖于模板参数T
,因此应在定义模板时解析。这称为两阶段查找。 clang发现错误的方法只是在看到它后立即尝试解析调用A(0)
。
我的GCC版本也会静默编译此代码,即使使用-pedantic-errors
也是如此。 C ++ 03和C ++ 11都表示即使程序格式错误也不需要诊断,因此GCC符合要求。这是C ++ 03中的14.6 / 7和C ++ 11中的14.6 / 8:
如果无法为模板定义生成有效的专业化, 并且该模板未实例化,模板定义是 形成不良,无需诊断。
答案 1 :(得分:5)
是。如果没有有效的专业化但模板没有实例化 - 就像这里一样 - 程序格式不正确,但不需要诊断(14.6 / 8)。所以clang和g ++都是对的。
clang在模板声明上比g ++做更多的检查。
见上文。