2013-05-22 100 views

回答

9

很多早期的C++编译器都实例化了所有的成员函数,无论你是否曾经调用它们。

考虑例如std::list,其具有sort成员函数。使用当前运行正常的编译器,可以通过不支持比较的类型实例化list。如果您尝试使用list::sort,则会失败,因为您不支持比较。只要你不打电话给sort这个清单,尽管如此,因为list<T>::sort不会被实例化,除非你打电话给它。

但是,使用那些功能不佳的编译器,尝试创建list<T>意味着即使您从未使用过list<T>::sort也会被实例化。 list::sort的存在意味着您需要为T实施<,只是为了创建list<T>,即使您根本没有在该类型的列表上实际使用sort

0

一类的方法也是成员。类模板方法在被实例化的类调用时被实例化。所以有可能这些成员方法从未被实例化。

1

该标准清楚地表明(非模板和模板)成员方法实例只有在使用时才会发生。

从C++标准的摘录(N3690 - 14.7.1(2)隐式实例)

2除非类模板或构件模板的成员已被显式实例或明确专门中,该部件的专业化被隐式实例化,当需要成员定义存在的上下文中引用专业化时;特别是静态数据成员的初始化(以及任何相关的副作用)不会发生,除非静态数据成员本身以需要静态数据成员定义存在的方式使用。

相关问题