维基百科的文章是这样说的:
实例化类模板不会导致其成员定义被实例化。
我无法想象 C++ 中的任何类被实例化,无论是否来自模板,类成员也没有被实例化?
许多早期的 C++ 编译器都实例化了所有成员函数,无论你是否调用过它们。
例如,考虑std::list
具有sort
成员函数的 。使用当前运行正常的编译器,您可以list
对不支持比较的类型进行实例化。如果你尝试使用list::sort
,它会失败,因为你不支持比较。只要您不调用sort
该列表,一切都很好,因为list<T>::sort
除非您调用它,否则不会被实例化。
然而,对于那些旧的、功能不佳的编译器,尝试创建list<T>
意味着list<T>::sort
即使您从未使用过它也已实例化。的存在list::sort
意味着您需要实现<
for T
,只是为了创建一个list<T>
,即使您根本没有真正sort
在该类型的列表上使用过。
该标准明确规定(非模板和模板)成员方法实例化仅应在使用时发生。
摘自 C++ 标准(N3690 - 14.7.1(2) 隐式实例化)
2 除非类模板或成员模板的成员已被显式实例化或显式特化,否则当在需要成员定义存在的上下文中引用特化时,成员的特化将被隐式实例化;特别是,静态数据成员的初始化(以及任何相关的副作用)不会发生,除非该静态数据成员本身的使用方式要求该静态数据成员的定义存在。
类的方法也是成员。类模板方法在被实例化的类调用时被实例化。因此,这些成员方法可能永远不会被实例化。