假设您有以下(格式错误的)程序:
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;
}
Run Code Online (Sandbox Code Playgroud)
GCC编译这个程序没有任何错误,clang ++拒绝它错误.
Ste*_*sop 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:
如果能为一个模板定义不会产生有效的专业化,该模板不会被实例化,模板定义形成不良的,没有诊断需要.
是.如果没有有效的专业化但模板没有实例化 - 就像这里一样 - 程序格式不正确,但不需要诊断(14.6/8).所以clang和g ++都是对的.
clang在模板声明上比g ++做更多的检查.
往上看.