10

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

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++ 标准对这些情况有什么看法?
4

2 回答 2

11

模板在使用时被实例化。但是,它应该在定义时进行编译。您的代码A(0)使用 name A,它不依赖于模板参数T,因此应该在定义模板时解析它。这称为两阶段查找。clang 发现错误的方法就是在看到调用后立即尝试解决A(0)它。

我的 GCC 版本也会静默编译这段代码,即使是-pedantic-errors. C++03 和 C++11 都说不需要诊断,即使程序格式错误,所以 GCC 符合。这是 C++03 中的 14.6/7 和 C++11 中的 14.6/8:

如果无法为模板定义生成有效的特化,并且该模板未实例化,则模板定义格式错误,无需诊断。

于 2013-01-07T10:20:32.423 回答
5
  1. 是的。当不存在有效的特化但没有实例化模板时——就像这里——程序格式错误,但不需要诊断 (14.6/8)。所以clang和g++都是对的。

  2. 与 g++ 相比,clang 对模板声明的检查更多。

  3. 往上看。

于 2013-01-07T10:32:03.313 回答