5

我知道您不能将虚拟方法声明为模板,因为编译器不知道要在虚拟表中保留多少条目。然而,这是一个技术限制,而不是语言限制。编译器可以知道实际需要多少模板实例,并“返回”以分配适当的 vtable 大小。

即将发布的标准中是否有计划的技术解决方案?

4

3 回答 3

4

编译器永远无法知道模板的所有可能实例化。在目前的编译模式下,每个翻译单元都是单独编译后链接的。在一个翻译单元中编译模板类型时,您不知道该类型在另一个翻译单元中的实例化。

想象一下,您正在编写一个库,并且想要在其中包含一个模板函数。您编译该库,然后将其分发给您的客户。现在客户可以使用他们喜欢的任何模板参数来实例化您的模板函数,但是您的库已经编译好了!它不能“返回”并改变这一点。

您假设在编译模板函数时,您还可以使用该函数的每个实例化。通常情况并非如此,并且在当前的编译和链接模型下,不可能知道是这种情况。

于 2013-03-27T12:10:11.170 回答
3

鉴于不需要使用现有链接器,这当然是可能的。也就是说,链接器可以筛选该模板函数的所有实例并构建适当的数据结构。但是 C++ 的优势之一是它不需要专门的链接器。这使得它可以移植到链接器是用石头编写并且无法更改的系统。而且,是的,这种情况发生了;链接器是所有目标代码相遇的地方,它必须与系统支持的所有编程语言兼容,这反过来意味着它有时会变得陈旧和笨拙,并且任何变化带来了很大的破损风险。所以,虽然理论上可以做到这一点,但它不会发生。

于 2013-03-27T12:23:56.970 回答
1

根据 C++ 标准委员会的论文核心语言问题,目前没有任何计划。C++ 标准规定了 C++ 实现的要求,但没有定义技术实现本身。因此,模板虚函数明确不是技术限制,而是标准定义的语言的限制。然而,语言的限制可能是改变现有实现所涉及的风险的结果,而不是由于实现的技术限制而强加的。

于 2013-03-27T13:30:27.453 回答