类模板何时实例化?

时间:2013-01-07 10:16:25

标签: 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;
}

GCC编译此程序时没有任何错误,clang ++拒绝错误。

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

2 个答案:

答案 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)

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

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

  3. 见上文。