C ++ 11翻译阶段8混乱

时间:2012-09-30 21:31:36

标签: c++ templates compiler-construction c++11

  

阶段7:分隔标记的空白字符不再重要。   每个预处理令牌都转换为令牌。所结果的   令牌在语法和语义上被分析并翻译为   翻译单位。

     

阶段8:组合翻译的翻译单元和实例化单元   如下:检查每个翻译的翻译单元以产生a   所需实例化列表。所需的定义   模板位于。它是实现定义的源   需要包含这些定义的翻译单元   能得到的。执行所有必需的实例化   生成实例化单元。[注意:这些与翻译类似   翻译单元,但不包含对未实例化的引用   模板,没有模板定义。 - 结束注意]该程序是   如果任何实例化失败,将会形成错误。

我删除了一些缩短粘贴文字的笔记。

为什么在翻译单元已经在C ++的编译阶段8翻译后才进行模板定位和实例化?考虑到两阶段名称查找,这些步骤是否应该在阶段7中进行?

2 个答案:

答案 0 :(得分:0)

我认为这部分与模板化类型的预编译有关。任何模板化的类型都是“实例化单元”。如果模板化类型是预编译的,则需要在此阶段进行处理。

答案 1 :(得分:0)

这是now-deprecated 导出模板功能的延续。导出模板允许将类和函数模板的定义与其声明分开(在适当的意义上)。

作为一个实现细节,将翻译单元翻译与模板实例化分离是有意义的,因为它可以减少冗余工作实例化模板。但是,大多数当前编译器在转换单元转换时实例化所有模板,并在链接时消除重复实例化。

希望概念和模块能够在将来重新引入类似的功能。