模板中的第二阶段编译

时间:2017-03-13 15:13:47

标签: c++ templates

我正在尝试理解c ++模板中的编译过程和代码生成过程。

我已经读过,在编译的第一阶段,只检查基本语法(在模板化代码中)。 并且实际代码仅针对那些完全完成编译的数据类型生成 - 这被称为第二阶段编译。

  1. 我无法理解编译器如何知道调用模板化代码的数据类型以及生成代码的数据类型(从而进行第二阶段编译)。可能存在这样的情况:函数调用(在关闭函数模板的情况下)在编译期间可能不那么直接导出数据类型,这些只能在运​​行时基于用户的输入导出。

  2. 假设我已经编写了一个巨大的代码,使用了很多条件的模板,它基于这些条件生成模板化代码的新实例(比如说类的新数据类型实例)。我无法测试所有数据类型的代码。那么这是否意味着如果我测试它的几种数据类型,我的代码仍有可能意外地失败了一些其他数据类型?如果是这样,我如何确保对所有数据类型强制进行第二次编译(不论基于我输入的数据类型是否实例化)。

2 个答案:

答案 0 :(得分:1)

  1. 编译时确定的类型仅依赖于静态信息。与特定类型一起使用的函数模板将为该类型生成代码,因为该选项需要在运行时中可用。但是,如果可以静态地确定函数调用将从不发生,我认为编译器可能会省略该实现,但是在某些情况下仍会强制执行该操作。

  2. 您无法测试所有数据类型,因为它是无限集。您可以创建一组所有标准类型,但显然无法检查每个用户定义的类型。通用代码中的想法是不依赖于您允许通过它的类型的细节。或者,您可以关闭一组可能的实例,仅 包括您批准的类型。

答案 1 :(得分:1)

  

我无法理解编译器如何知道调用模板化代码的数据类型

编译器知道实际调用模板化代码 的数据类型,因为它会看到程序中实际调用模板化代码的每个位置。这里没有魔力。实例化发生在呼叫站点。对于未在实际现有调用中使用的类型,不进行实例化。

  

我的代码仍有可能失败

对于所有基于测试的验证,模板或无模板,甚至软件以外的其他内容都是如此。您无法通过测试涵盖所有可能的用例。这是生活中的一个基本事实。处理它...不知何故。