阶段7:分隔标记的空白字符不再重要。 每个预处理令牌都转换为令牌。所结果的 令牌在语法和语义上被分析并翻译为 翻译单位。
阶段8:组合翻译的翻译单元和实例化单元 如下:检查每个翻译的翻译单元以产生a 所需实例化列表。所需的定义 模板位于。它是实现定义的源 需要包含这些定义的翻译单元 能得到的。执行所有必需的实例化 生成实例化单元。[注意:这些与翻译类似 翻译单元,但不包含对未实例化的引用 模板,没有模板定义。 - 结束注意]该程序是 如果任何实例化失败,将会形成错误。
我删除了一些缩短粘贴文字的笔记。
为什么在翻译单元已经在C ++的编译阶段8翻译后才进行模板定位和实例化?考虑到两阶段名称查找,这些步骤是否应该在阶段7中进行?
答案 0 :(得分:0)
我认为这部分与模板化类型的预编译有关。任何模板化的类型都是“实例化单元”。如果模板化类型是预编译的,则需要在此阶段进行处理。
答案 1 :(得分:0)
这是now-deprecated 导出模板功能的延续。导出模板允许将类和函数模板的定义与其声明分开(在适当的意义上)。
作为一个实现细节,将翻译单元翻译与模板实例化分离是有意义的,因为它可以减少冗余工作实例化模板。但是,大多数当前编译器在转换单元转换时实例化所有模板,并在链接时消除重复实例化。
希望概念和模块能够在将来重新引入类似的功能。