我刚刚发现,当涉及到模板时,这个代码在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()
之前没有编译错误,但这是否合法?
答案 0 :(得分:11)
是的,这是合法的。模板规范是在实例化方法之前,它不存在,因此编译器不会检查它。以下是the spec的相关位:
14.7.1 - 隐式实例化
-9-实现不应隐式实例化函数 模板,成员模板,a 非虚拟成员函数,成员 一个类或一个静态数据成员 不需要的类模板 实例