为什么编译器在某些情况下看不到模板类中的错误?

Why doesn't the compiler see errors in a template class in some cases?

本文关键字:错误 看不到 编译器 情况下 为什么      更新时间:2023-10-16

我偶然发现了我没有除了我没有的行为(6.2.1)编译器的行为。似乎在某些情况下,当不使用错误的函数定义时,G 忽略了模板类中的错误。

让我们以这个示例:

class A
{
  bool _var;
  public:
    void myFunc() const
    {
      _var = true;
    }
};
int main()
{
  A a;
  return 0;
}

编译器返回以下错误:

错误:在只读对象中的成员'a :: _ var'的分配

这就是我所期望的。现在让我们制作类模板:

template <typename MyType>
class A
{
  bool _var;
  public:
    void myFunc() const
    {
      _var = true;
    }
};
int main()
{
  A<int> a;
  return 0;
}

这可以很好地编译,甚至认为我们正在尝试将值分配给const方法中的成员变量。然后,如果我尝试使用MyFunc函数,则编译器将再次看到错误并拒绝编译。

为什么会发生这种情况?编译器不应该在每种情况下都能看到错误吗?

谢谢!

这正在发生,因为模板类的成员本身就是模板,因此仅在使用时就实例化。未使用的模板仅进行某些检查(所谓的两步实例化)。