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