答案 0 :(得分:9)
许多早期的C ++编译器实例化了所有成员函数,无论你是否曾调用它们。
例如,考虑std::list
,它具有sort
成员函数。使用当前正常运行的编译器,您可以在不支持比较的类型上实例化list
。如果您尝试使用list::sort
,则会失败,因为您不支持比较。只要您没有为该列表调用sort
,它就可以了,因为list<T>::sort
除非您调用它,否则不会被实例化。
然而,对于那些较旧,功能较差的编译器,尝试创建list<T>
意味着即使您从未使用它,list<T>::sort
也会被实例化。 list::sort
的存在意味着您需要为<
实施T
,只是为了创建list<T>
,即使您从未在列表中实际使用过sort
那种类型。
答案 1 :(得分:1)
该标准清楚地表明(非模板和模板)成员方法实例化仅在使用时才会发生。
摘自C ++标准(N3690 - 14.7.1(2)隐式实例化)
2除非已明确实例化或明确专门化类模板或成员模板的成员,否则在要求成员定义存在的上下文中引用特化时,将隐式实例化成员的特化。 /强>;特别是,除非静态数据成员本身以需要静态数据成员定义存在的方式使用,否则不会发生静态数据成员的初始化(以及任何相关的副作用)。
答案 2 :(得分:0)
班级的方法也是成员。类模板方法在为该实例化类调用它们时进行实例化。因此,这些成员方法可能永远不会被实例化。