这段代码在C ++中是否合法

时间:2009-11-26 22:53:12

标签: c++ templates const const-correctness

我刚刚发现,当涉及到模板时,这个代码在g ++ 3.4.2中编译并且除非不调用m(),否则它可以工作:

template <typename T>
class C
{
     T e;

     public:
        C(): e(0) {};

    void m()
    {
        e = 0;
    };
 };

现在可以创建并使用实例

C<const int> c;

在调用c.m()之前没有编译错误,但这是否合法?

1 个答案:

答案 0 :(得分:11)

是的,这是合法的。模板规范是在实例化方法之前,它不存在,因此编译器不会检查它。以下是the spec的相关位:

  

14.7.1 - 隐式实例化

     

-9-实现不应隐式实例化函数   模板,成员模板,a   非虚拟成员函数,成员   一个类或一个静态数据成员   不需要的类模板   实例