类模板何时实例化?

csc*_*wan 10 c++

假设您有以下(格式错误的)程序:

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 ++拒绝它错误.

  1. 是否有理由说这不是 GCC中的错误,因为模板没有实例化?
  2. 铿锵有什么魔力来发现这个错误?
  3. C++标准对这些情况有何评价?

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:

如果能为一个模板定义不会产生有效的专业化,该模板不会被实例化,模板定义形成不良的,没有诊断需要.

  • 它的结构不合理,但明确提到不需要诊断. (2认同)

APr*_*mer 5

  1. 是.如果没有有效的专业化但模板没有实例化 - 就像这里一样 - 程序格式不正确,但不需要诊断(14.6/8).所以clang和g ++都是对的.

  2. clang在模板声明上比g ++做更多的检查.

  3. 往上看.